刚学不久的新人qwq 五个点re,有好哥哥帮我看一下吗
查看原帖
刚学不久的新人qwq 五个点re,有好哥哥帮我看一下吗
197011
Ibukifalling楼主2020/10/4 12:13
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long int n,p,i,allcost;
double ans,expower;
struct mac{
	long long int cost,power;
	double time;
};
bool cmp(mac x,mac y){
	if(x.time<=y.time) return 1;
	else return 0;
}
mac a[N];
int main(){
	scanf("%lld%lld",&n,&p);
	for(i=1;i<=n;i++){
	scanf("%lld%lld",&a[i].cost,&a[i].power);
	a[i].time=a[i].power*1.0/(1.0*a[i].cost);
	allcost+=a[i].cost;
    }
    if(allcost<=p){
    	printf("-1");
    	return 0;
	}
	allcost=0;
    sort(a+1,a+1+n,cmp);
    allcost=a[1].cost;
    expower=a[1].time*p;
    for(i=1;i<=n;i++){
    	if(i==n||(a[i+1].time-a[i].time)*p+expower<(a[i+1].time-a[i].time)*allcost){
    		if(allcost==p){
    			allcost+=a[i+1].cost;
    			continue;
			}
    		ans=a[i].time+expower*1.0/((allcost-p)*1.0);
    		break;
		}
		else{
			expower+=(a[i+1].time-a[i].time)*(p-allcost);
			allcost+=a[i+1].cost;
		}
	}
	printf("%lf",ans);
	return 0;
}

本蒟蒻码风毒瘤,求不要喷……(/ω\) 虽然题目标签里有二分,但我好像没有用到二分。思路是按照不充电时能使用的时间排序,然后从最快耗尽的设备开始充电,直到充不上来就算一下时间。 re应该不是除数为0的问题,也应该不是死循环或者数组小了。蒟蒻流泪呜呜呜

2020/10/4 12:13
加载中...