HDU1597二分查找

来源:互联网 发布:stc最新单片机 编辑:程序博客网 时间:2024/04/29 10:55

HDU1597

首先这道题的思路是二分查找

我们先开一个数组sto,sto[i]用来记录Si之前(包括Si)的总共的数字的个数,一个for循环即可实现

然后我们根据输入的n在sto[i]区间的对比情况就可以判断出n所在对应的S的下标

然后剩下都就是取余运算就可以了


二分法思想简单,但是判断辩解是十分困难的,参考了网上大神们的建议,我总结了一下相对好理解的边界判定情况


1.n>sto[mid]&&n<=sto[mid+1]

当n满足上面式子的时候,n刚好在sto[mid]之后,sto[mid+1]之前,所以n前有mid个S串

2.n<=sto[mid]&&n>sto[mid-1]

当n满足上面式子的时候,n刚好在sto[mid-1]之前,sto[mid]之后,所以n前有mid-1个串

3.身下的边界很好理解,主要是上面两个


附上AC代码

#include"iostream"#include"cstdio"using namespace std;int sto[80000];int n;int w;void mybin(int left,int right){int mid=(left+right)/2;if(n>sto[mid]&&n<=sto[mid+1]) {w=mid;return ;}else{if(n<=sto[mid]&&n>sto[mid-1]) {w=mid-1;return ;}else {if(n<=sto[mid-1]) mybin(left,mid-1);else mybin(mid+1,right);}}}int main(){int t;for(int i=1;i<=65536;i++){sto[i]=sto[i-1]+i;}cin>>t;while(t--){cin>>n;mybin(1,65536);int t=n-sto[w];t=t%9;if(t==0) cout<<9<<endl;else cout<<t<<endl; }return 0;}





0 0