不懂,为啥会SF呢
查看原帖
不懂,为啥会SF呢
853487
oidd楼主2023/3/23 17:00

后六个数据有五个SF????


#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 100010;
typedef pair<double, double> PII;
int n, p;
PII a[N];
bool cmp(PII& a, PII& b)
{
	return a.second * b.first <= b.second * a.first;
}
bool check(double x)
{
	double sum = 0, tol = 0;
	for (int i = 0; i < n; ++ i)
	{
		sum += a[i].first, tol += a[i].second;
		// cout << x << " " << tol / (sum - p) << endl;
		if (tol < x * (sum - p)) return true;
	}
	return false;
}
// int check(double ans)
// {//验证答案
// 	double q=p*ans;//充电器最多提供的能量
// 	double sum=0;
// 	for(int i=0;i<n;i++){
// 		if(a[i].first*ans<=a[i].second){//若设备已有的能量大于使用时间需要的能量
// 			continue;//忽略该设备
// 		}
// 		sum+=(a[i].first*ans-a[i].second);//否则用充电器充电,使设备已有的能量等于使用时间需要的能量,并记录需要的能量。
// 	}
// 	return sum<=q;//最后比较需要的能量总和和充电器最多提供的能量。
// }
int main() 
{
	scanf("%d%d", &n, &p);
	double sum = 0;
	for (int i = 0; i < n; ++ i)
	{
		cin >> a[i].first >> a[i].second;
		sum += a[i].first;
	} 
	if (p >= sum)
	{
		cout << -1;
		return 0;
	}

	sort(a, a + n, cmp);
	double l = 0, r = 1e10;
	
	while (r - l > 1e-6)
	{
		// cout << "l:" << l << " r: " << r << endl;
		double mid = (l + r) / 2;
		// cout << mid << " "; 
		if (check(mid)) r = mid;
		else l = mid;
	}
	printf("%.10lf\n", l);




    return 0;
}
2023/3/23 17:00
加载中...