警钟长鸣
查看原帖
警钟长鸣
664684
Doushabao_233楼主2024/9/1 15:09

这是一个很普通的代码对吧

#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。

好了,思路什么的都没问题,我们来提交一下:

image.png

竟然只得了90分!好吧,90分也还好,又能怎么样呢?但是如果我告诉你,剩下的10分只需要加两句话就能解决,那就有点可惜了:

  1. 在头文件部分加一句#define endl "\n"
  2. 在main函数开头加一句ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

这样一番操作后,再提交会?

image.png

恭喜你通过了本题。

所以,大家以后一定不要忘了优化cin, cout, endl啊!!!!

另外,也别忘了开long long。

灵感来源这篇文章。我也是看了这篇文章后,才知道endl的效率和\n竟然有所差距。

2024/9/1 15:09
加载中...