Codeforces Round 886 (Div. 4)

E
这个样例已经比较特殊了,但是自己还是全部都过了,用的是二分,实在是想不明白自己哪里做错了,当时是交了五次,都错了,都错在样例三,我感觉我的代码没有毛病:
第二天的我来补题了
好吧,我承认这个题目牛逼,这个题目卡常数,有一点必须注意,就是在算的面积的过程中,如果发现面积大于总的面积了,就立马停下不用再算了,我就是没有注意到这一点,然后wa了,还有一点在二分当中可以节约点时间的小技巧:详细见代码二分部分,以后自己写的时候可以注意一点,如果符合要求就立马输出,不要再输出别的东西了

#include
#include
#include 
#include 
using namespace std;
typedef unsigned long long ll;
const ll N = 2e5 + 10;

ll n,c;
ll mid;
ll a[N];
ll b[N];
ll ans(){
	ll res = 0;
	for(ll i = 0;i < n;i ++){
		res += (a[i] + 2 * mid) * (a[i] + 2 * mid);
		if(res > c)break;
	}
	return res;
}
int main(){
	ll t;
	cin >> t;
	while (t--){
		//0 1 2 3 4 5     
		cin >> n >> c;
		for(ll i = 0;i < n;i ++) cin >> a[i];
		int flag = 0;
		ll l = 1,r = 1e10;
		while(l < r){
			mid = (l + r ) / 2;
			if(ans() == c){
				cout << mid << endl;
				flag ++;
			}
			if(ans() >= c){
				r = mid;	
			}
			else{
				l = mid + 1;
			}
		}
		if(!flag)cout << r  << endl;
	}
	return 0;
}

这个是自己的当时第一次的错误代码:

#include
#include
#include 
#include 
using namespace std;
typedef unsigned long long ll;
const ll N = 2e5 + 10;

ll n,c;
ll mid;
ll a[N];
ll b[N];
ll ans(){
	ll res = 0;
	for(ll i = 0;i < n;i ++){
		res += (a[i] + 2 * mid) * (a[i] + 2 * mid);
	}
	return res;
}
int main(){
	ll t;
	cin >> t;
	while (t--){
		//0 1 2 3 4 5     
		cin >> n >> c;
		
		for(ll i = 0;i < n;i ++) cin >> a[i];
		
		ll l = 1,r = 1e10;
		while(l < r){
			mid = (l + r) / 2;
			if(ans() >= c){
				r = mid;	
			}
			else{
				l = mid + 1;
			}
		}
		cout << l  << endl;
	}
	return 0;
}

你可能感兴趣的:(算法,数据结构)