A. Voltage Keepsake(二分枚举)

https://codeforces.com/problemset/problem/772/A


输入输出样例

输入 #1复制

2 1
2 2
2 1000

输出 #1复制

2.0000000000

输入 #2复制

1 100
1 1

输出 #2复制

-1

输入 #3复制

3 5
4 3
5 2
6 1

输出 #3复制

0.5000000000

说明/提示

In sample test 1, you can charge the first device for the entire time until it hits zero power. The second device has enough power to last this time without being charged.

In sample test 2, you can use the device indefinitely.

In sample test 3, we can charge the third device for 2/52/5 of a second, then switch to charge the second device for a 1/101/10 of a second.


思路:比较明显的二分.check的时候判充电桩能充的电总量赋给每一个机器后最后还剩。

代码注意:while(r-l>1e-10)虽然保证精度,但是TLE31.放小了也tle。干脆改成固定循环一百次。上界取1e19近乎LL最大,不然wa31

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
LL n,p;
struct node{
  LL a,b;	
}c[maxn];
bool check(double x)
{
	double ans=x*p;
	for(LL i=1;i<=n;i++){
		if(c[i].a*x>c[i].b){
			ans-=1.0*c[i].a*x-1.0*c[i].b;
		}		
	}
	if(ans>=0) return true;
	else return false;
}
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  cin>>n>>p;
  LL sum1=0;LL sum2=0;
  for(LL i=1;i<=n;i++){
  	cin>>c[i].a>>c[i].b;
  	sum1+=c[i].a;sum2+=c[i].b;
  }
  	double l=0.0;double r=1e19;
//  while(r-l>1e-6){
	for(LL i=0;i<100;i++){
  	    double mid=(1.0*l+1.0*r)/2;
		if(check(mid)) l=mid;
		else r=mid;	
	}
	if(l>=1e18) printf("-1\n");
	else printf("%.10f\n",l);
return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/108503522