【StarryCoding P99】三角形数字的位置 题解(动态规划+组合数学+滚动数组)

[P99] 三角形数字的位置

我们都知道著名的杨辉三角,长下面这个样子:

   11 11 2 1
1 3 3 1
...

将他们从上往下可以排列为:1,1,1,1,2,1,1,3,3,1,... 这样一个数列。

q q q次询问,每次询问请你求出数字 N N N第一次在数列中出现的位置。

输入描述

第一行一个整数 q q q ( 1 ≤ q ≤ 1 0 5 ) (1 \leq q \leq 10^5) (1q105)

对于每次询问,一行一个整数 N N N ( 1 ≤ N ≤ 1 0 9 ) (1 \leq N \leq 10^9) (1N109)

输出描述

一个整数表示结果。

输入样例

3
3
1
6

输出样例

8
1
13

思路

首先,从输入中读取测试用例的数量q,并将每个测试用例的值n存入数组n[],同时在映射m1中对应的键值设为-1。

对于杨辉三角的每一行,使用动态规划的方法计算组合数,存入二维数组dp[][]。在计算过程中,如果计算得到的组合数大于1e9,则停止计算,因为题目中给出的n的最大值为1e9。如果映射m1中存在这个组合数,并且其对应的值为-1(即还未被赋过值),则将其值设为当前的位置,这里的位置是通过等差数列求和公式计算得出的。

对于映射m1中还未被赋过值的键,使用等差数列求和公式计算其值,这里的值代表的是数字在杨辉三角数列中出现的位置。

最后,对于每个测试用例,输出其在杨辉三角数列中出现的位置,这个位置就是映射m1中对应的值。

注意

  1. 在计算位置时,要将乘法结果强制转换为 long long 类型,否则无法通过部分测试点。
  2. 动态规划的 j 是从1开始的,会把数字 1 1 1的判断漏掉。数字 1 1 1第一次在数列中出现的位置一定是1,要写 m1[1] = 1;

AC代码

#include <iostream>
#include <map>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;int q;
ll n[N];
ll dp[2][N];
map<ll, ll> m1;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> q;for (int i = 1; i <= q; i++) {// 离线处理cin >> n[i];m1[n[i]] = -1;}m1[1] = 1;for (int i = 1; i <= 1e5; i++) {int t = i & 1;dp[t][0] = 1;for (int j = 1; j <= i; j++) {// 求组合数dp[t][j] = dp[t ^ 1][j - 1] + dp[t ^ 1][j];if (dp[t][j] > 1e9) {break;}if (m1.count(dp[t][j]) && !~m1[dp[t][j]]) {// 等差数列求和m1[dp[t][j]] = (1ll * i * (i - 1) / 2) + j + 1;}}}for (auto &i : m1) {if (!~i.second) {// 等差数列求和// 在第f+1行的第二个位置i.second = i.first * (i.first + 1) / 2 + 2;}}// 回答for (int i = 1; i <= q; i++) {cout << m1[n[i]] << "\n";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506152.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】遵守 robots.txt 规则的数据爬虫程序

程序1 编写一个遵守 robots.txt 规则的数据爬虫程序涉及到多个步骤&#xff0c;包括请求网页、解析 robots.txt 文件、扫描网页内容、存储数据以及处理异常。由于编程语言众多&#xff0c;且每种语言编写爬虫程序的方式可能有所不同&#xff0c;以下将使用 Python 语言举例&am…

MATLAB知识点:if条件判断语句的嵌套

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 我们通过一个…

【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧

在ArcGIS Pro二次开发中&#xff0c;SDK提供了一种工具界面【ArcGIS Pro ProWindow】。 关于ProWindow的用法&#xff0c;之前写过一篇基础的教程&#xff1a; 【ArcGIS Pro二次开发】(13)&#xff1a;ProWindow的用法_arcgispro二次开发教程-CSDN博客 主要是对几个常用控件…

MSCKF3讲:后端理论推导(上)

MSCKF3讲&#xff1a;后端理论推导&#xff08;上&#xff09; 文章目录 MSCKF3讲&#xff1a;后端理论推导&#xff08;上&#xff09;1 MSCKF中的状态变量① IMU状态:② cam0状态&#xff1a;③ IMU和cam0间状态关系 2 微分方程递推&#xff08;数值解&#xff09;3 IMU状态预…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

5 分钟配置好 Electron 应用的图标

最近在开发博客本地客户端 HexoPress&#xff0c;应用做好后&#xff0c;需要打包&#xff0c;如果不希望打包出来 App 的图标用的是 Electron 默认的星球环绕的图标&#xff0c;那么需要自己制作图标。 制作图标 首先&#xff0c;你需要给各种操作系统制作一个满足要求的图标…

软考54-上午题-【数据库】-关系模式的范式-真题

一、范式总结 第一步&#xff0c;先求候选码&#xff0c;由此得到&#xff1a;主属性、非主属性。 二、判断部分函数依赖的技巧 【回顾】&#xff1a;部分函数依赖 &#xff08;X&#xff0c;Y&#xff09;——>Z&#xff1b; X——>Z 或者 Y——>Z 题型&#xff1a;给…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

MySQL 常用优化方式

MySQL 常用优化方式 sql 书写顺序与执行顺序SQL设计优化使用索引避免索引失效分析慢查询合理使用子查询和临时表列相关使用 日常SQL优化场景limit语句隐式类型转换嵌套子查询混合排序查询重写 sql 书写顺序与执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…

CKKS EXPLAINED: PART 1, VANILLA ENCODING AND DECODING

CKKS EXPLAINED: PART 1, VANILLA ENCODING AND DECODING Introduction 同态加密是一个有前途的领域&#xff0c;它允许在加密数据上进行计算。一篇名为“同态加密是什么”的博文提供了广泛的解释&#xff0c;说明了同态加密的含义以及这一研究领域的重要性。 在本系列文章中…

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路&#xff08;升序&#xff09; 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的…

使用OpenCV和mediapipe实现手部信息抓取

目录 运行效果 挨行解读 &#xff08;1&#xff09;初始化MediaPipe Hand模块 &#xff08;2&#xff09;打开摄像头 &#xff08;3&#xff09;初始化计时器 &#xff08;4&#xff09;开始程序主题部分 &#xff08;5&#xff09;读取视频帧 &#xff08;6&#xff09…