题目链接:http://codeforces.com/contest/801/problem/C

题意:给出一个充电器每秒钟充p个点,还有n个电器要同时使用a[i]表示第i个电器每秒钟用多少点,b[i]表示第i个

原来存了都少电。充电器可以无缝切换这充电,但是只能给一个充(同一时间)。最后问你最长可用多久,如果可以

无限时间的用的话,就输出-1。

题解:首先确定一下什么时候输出-1也就是可以无限充电的情况,就是p大于所有a的总和就行。

然后就是时间有限的情况。这里明确一个式子。

need*t=a[i]*t-b[i],(need表示每秒需要的时间,t表示时间)然后for一下1~n

need+=(a[i]-b[i]/t)

如果need<=p那么这个时间就是符合的。

然后就是枚举时间,枚举时间可以用二分,不妨设l=0,r=1e10,mid=(l+r)/2。然后就是二分的次数,由于精度要求是

1e-4所以二分50次左右就够了。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 1e5 + 10;
double a[M] , b[M];
int main() {
int n;
double p;
scanf("%d%lf" , &n , &p);
double sum = 0;
for(int i = 0 ; i < n ; i++) {
scanf("%lf%lf" , &a[i] , &b[i]);
sum += a[i];
}
if(sum <= p) {
cout << -1 << endl;
}
else {
double l = 0 , r = 1e10;
double mid = (l + r) / 2;
for(int j = 1 ; j <= 50 ; j++) {
mid = (l + r) / 2;
double need = 0;
for(int i = 0 ; i < n ; i++) {
need += max(0.0 , 1.0 * a[i] - b[i] / mid);
}
if(need <= p) l = mid;
else r = mid;
}
printf("%.10lf\n" , l);
}
return 0;
}

最新文章

  1. spring 上传 下載文件
  2. 在ubuntu14.04设置静态ip
  3. R语言 recommenderlab 包
  4. java单例之enum实现方式
  5. React-Native的基本控件属性方法
  6. ubuntu下PHP支持cURL
  7. SQL数据库关键字和列名冲突处理
  8. intellij idea该插件开发摘要
  9. Go - method
  10. 【Linux基础】压缩和解压
  11. Mango 基础知识
  12. python &amp; mysql 操作(compare_sum_fee)
  13. 《推荐》安装Photoshop详细步骤 ,手把手,一步一步,具体详细地教你安装Photoshop (Adobe photoshop CS6)
  14. 分布式ID生成系统 UUID与雪花(snowflake)算法
  15. java 8 日期函数
  16. oracle字符串处理函数--待整理
  17. SQL 根据条件取不同列中的值来排序
  18. c++11 多线程新特性学习 (1) 管理线程
  19. sleep() 函数
  20. 注解实现AOP

热门文章

  1. Java的编译原理
  2. DesignPattern系列__02接口隔离原则
  3. 自练Eclipse搭建SSH全自动注解博客项目笔记
  4. 算法与数据结构基础 - 哈希表(Hash Table)
  5. Day01:JAVA开发环境
  6. Java编程基础阶段笔记 day 07 面向对象编程(上)
  7. Java学习多线程第一天
  8. 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
  9. 头部姿态估计 - Android
  10. Mac安装Homebrew的那些事儿