这是一个很普通的代码对吧
#include <iostream>
using namespace std;
const int N=1e5+1;
int db[N];
int init(){
int a=1;
int i=0;
for(i=0;a<=1e9;i++){
a+=i;
db[i]=a;
}
return i;
}
int m, temp, n;
bool slowSearch(int query){
for(int i=0;i<n;i++){
if(db[i]==temp){
return 1;
}
}
return 0;
}
bool binarySearch(int query){
int l = 0;
int r = n-1;
while(l<=r){
int mid = (l + r)/2;
if(db[mid] > query){
r=mid-1;
}
if(db[mid] < query){
l=mid+1;
}
if(db[mid]==query){//找到了
return 1;
}
}
return 0;
}
int main(){
n = init();
cin>>m;
while(m--){
cin>>temp;
cout<<binarySearch(temp)<<endl;
}
return 0;
}
本人变量命名并不是很好,因此简单说一下吧,这题我用的打表+二分查我打的表,init函数就是初始化打表的。这也没办法,因为如果你提前输入打好的表,他不好编译。db数组是存放一大堆数字的,
db[i]意思是在无穷的序列中第i个数字是1。这个序列只有0和1,故除了db数组之外的所有位都可以确定是0。每当查询一次,binarySearch就在这个db数组里二分查找有没有这一位?如果有就说明这一位是1,没有就说明这一位是0。
好了,思路什么的都没问题,我们来提交一下:

竟然只得了90分!好吧,90分也还好,又能怎么样呢?但是如果我告诉你,剩下的10分只需要加两句话就能解决,那就有点可惜了:
#define endl "\n"ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);这样一番操作后,再提交会?

恭喜你通过了本题。
所以,大家以后一定不要忘了优化cin, cout, endl啊!!!!
另外,也别忘了开long long。
灵感来源这篇文章。我也是看了这篇文章后,才知道endl的效率和\n竟然有所差距。