hdu2446--二分搜索+打表
2017-07-08 15:23
155 查看
题意大概就是:拿一堆炮弹,堆三角形,问最后一个炮弹,在第几个三角形的第几行的第几个。
数据量是小于2的63次方,我没找数学规律,用的打表做的。
大概想法就是,打一个 第i个三角形由几个炮弹组成的表(第i个=第i-1个+i),再打一个第i个三角形之前(包括第i个)一共有多少个炮弹。 然后先二分找炮弹在第几个三角形,再二分找在第几行。 最后算得最后位置。
数据量是小于2的63次方,我没找数学规律,用的打表做的。
大概想法就是,打一个 第i个三角形由几个炮弹组成的表(第i个=第i-1个+i),再打一个第i个三角形之前(包括第i个)一共有多少个炮弹。 然后先二分找炮弹在第几个三角形,再二分找在第几行。 最后算得最后位置。
#include <iostream> #include <cstdio> #define M 1000001 using namespace std; long long int num[M], sum[M]; void dabiao() { num[0] = sum[0] = 0; for(int i=1; i<M; i++) { num[i] = num[i-1] + i; sum[i] = num[i] + sum[i-1]; } } int twosearch1(long long int n) { int left = 0, right = M-1, middle; while(left + 1 != right) //这样找到 sum[left] < n <=sum[right] { middle = left + (right - left) / 2; //防止溢出 if(sum[middle] < n) { left = middle; } else { right = middle; } } return right; } int twosearch2(int right, long long int n) { int left = 0, middle; while(left + 1 != right) { middle = left + (right -left) / 2; if(num[middle] < n) { left = middle; } else { right = middle; } } return right; } int main() { int t; scanf("%d",&t); dabiao(); while(t--) { long long int n; int ans1,ans2,ans3; scanf("%I64d",&n); ans1 = twosearch1(n); ans2 = twosearch2(ans1,n-sum[ans1-1]); ans3 = n - sum[ans1-1] - num[ans2-1]; printf("%d %d %d\n",ans1,ans2,ans3); } return 0; }
相关文章推荐
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001 I Count Two Three(打表+二分搜索)
- HDU5878 I Count Two Three【打表+排序+二分搜索】
- hdu2446 (二分搜索)
- 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】
- 二分搜索错误情况的分析
- [算法专题] 二分搜索&排序数组
- HDU 5289 Assignment [RMQ区间查询+二分搜索]
- HDU 3220 Alice’s Cube (09年上海区域赛水题(位压缩、逆向搜索、打表))
- Trucking(HDU 2962 最短路+二分搜索)
- 二分搜索方法
- 插入算法 二分搜索 读数据结构与算法-C++
- 350. Intersection of Two Arrays II -- 双指针、哈希表、排序、二分搜索
- poj 3111 K Best 二分搜索 最大化平均值
- POJ2976 Dropping tests 二分搜索
- poj2976Dropping tests (二分搜索+还是涉及昨天遇见的o1分数规划)
- poj 3579 Median (二分搜索之查找第k大的值)
- 二分搜索
- POJ 2976 - Dropping tests(二分搜索)
- 二分搜索——74. Search a 2D Matrix
- POJ 1759 - Garland(二分搜索)