为什么右边界设小了会有tle呢?调成1e10就ac了。orz
查看原帖
为什么右边界设小了会有tle呢?调成1e10就ac了。orz
1330242
Hexfan楼主2024/4/12 00:12

如题,就是很疑惑。不应该有死循环吧?

#include<bits/stdc++.h> 
using namespace std;


int n, p, cost[100001], deposit[100001];
long long costSum = 0, depositSum = 0;
double test(double mid){
	//可使用时间为 mid 返回所需电量 
	double energy = 0, tmp;
	for(int i = 0; i<n; ++i) {
		tmp = deposit[i] - mid * cost[i];
		if(tmp < 0) energy -= tmp;
	}
	return energy;
}


int main(){
	scanf("%d%d", &n, &p);
	double l = 0, r = 0, mid, tmp;

	for(int i = 0; i<n; ++i){
		scanf("%d", &cost[i]);
		scanf("%d", &deposit[i]);
		costSum += cost[i];
		depositSum += deposit[i];
	}
	r = 1e10;
	if(p >= costSum){
		printf("-1");
		return 0;
	}
	//根据可使用时间 给出所需的充电功率 p 
	//可使用时间越长 充电功率越大 
	while(l < r){
		mid = l + (r - l)/2;
		if(test(mid) >= p * mid){
			//时长为 mid 所需的能量超过 p可以提供的 
			//需要减少时长 
			r = mid;
		}else{
			l = mid + 10e-5;
		}
	}
	printf("%f", l);
	return 0;
}

2024/4/12 00:12
加载中...