hdu2446--二分搜索+打表
来源:互联网 发布:淘宝高仿鞋哪些店铺 编辑:程序博客网 时间:2024/06/05 08:45
题意大概就是:拿一堆炮弹,堆三角形,问最后一个炮弹,在第几个三角形的第几行的第几个。
数据量是小于2的63次方,我没找数学规律,用的打表做的。
大概想法就是,打一个 第i个三角形由几个炮弹组成的表(第i个=第i-1个+i),再打一个第i个三角形之前(包括第i个)一共有多少个炮弹。 然后先二分找炮弹在第几个三角形,再二分找在第几行。 最后算得最后位置。
#include <iostream>#include <cstdio>#define M 1000001using 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;}
阅读全文
0 0
- hdu2446--二分搜索+打表
- hdu2446 (二分搜索)
- HDU2446
- hdu4542 搜索+打表
- HDU5878 I Count Two Three【打表+排序+二分搜索】
- hdu 5878 二分+打表
- hdu 5878 二分+打表
- poj2739(打表、搜索)
- hdu4662 简单搜索打表
- 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】
- hdu 1056 HangOver(暴力||打表二分)
- XTU 1185 暴力打表+二分
- UVA138(数论问题二分打表)
- hdu 5179(bfs打表+二分)
- HDU5676(DFS打表+二分查找)
- UVALive 2037 Digital Rivers 【打表&二分】
- hdu1397素数筛+打表+标记+二分
- Primes on Interval 【打表+二分】
- 前端资源汇集
- Hash的命令介绍与源代码剖析笔记(5)
- HDU 1272 小希的迷宫 (并查集+图论基本知识的运用)
- JS入门
- Mysql的binlog日志详解
- hdu2446--二分搜索+打表
- gcc与BOM
- SoftMax和代价函数
- 基于分布式的抢红包服务器
- Failed to resolve: 之一
- JAVA 串口编程(二)
- 数据滤波处理
- 有关A^B(hdoj2035)
- 临界区锁 InitializeCriticalSection()