Voltage Keepsake CodeForces - 801C (思维+二分)
这是一道很棒的二分题。
思路:
首先先思考什么情况下是可以无限的使用,即输出-1.
我们思考可知,如果每一秒内所有设备的用电量总和小于等于充电器每秒可以充的电,那么这一群设备就可以无限使用。
接下来分析不是无限使用的情况:
题目要求的是满足某个情况的最大值。
很像二分的类型,二分题目往往就是求某一个满足情况的最值,这样我们只需要寻找上限和下限,并对每一次mid值进行检验是否满足,这样的模型时间度一般为O( N*Log( L ))
L代表的是总区间的长度,而N代表的是完成一次判定需要的时间,一般题目可以O(N)进行暴力判断一个值是否满足情况。
那么接下来我们来分析此题目,分析在条件区间内是否单调,显然可知的单调的,因为随着设备使用的最大时间的变大,对充电器每秒可以充的电值的要求也变大。
判定的话,我们即要判断该最大使用时间的情况下,需要充电器每秒可以充值多少电,如果这个充电量小于等于题目给定的P值,那么就代表数据给的充电器可以满足这个任务,那么区间就可以选到 Mid-R这个区间进行再次查找。
本题目要求精度准确到至少1e-4,我开的eps为1e-6,保险一点,
然后区间我们定为 0~ 1e10
这个区间是需要自己分析的,左区间值0,不用多说,右区间值即最大的值,需要用题目的数据范围进行分析,初始我认为P的最大值为1e9,那么上限也应该是1e9,但是wa了一次,改成1e10就AC了。
然后我再次分析了一下数据范围,当极限数据,1e5个设备,每一个耗能为1,自带1e5的电,充电器的功率为1e5-1 ( 不 -1 的话就可以无限使用了)
这个数据情况下,我们可以知道,答案是大于1e9,小于1e10的,所以我们以1e10做峰值。
带精度问题的二分的方法有两种,可以见这篇博客。点我
附上我的AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb std::ios::sync_with_stdio(false)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
#define eps 1e-6
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
int h;
int x;
}a[maxn];
int n,p;
bool check(double mid)
{
double need=0.0000;
double sum=0.00000;
repd(i,,n)
{
need=mid*a[i].x-a[i].h;
if(need>0.0000000)
{
sum+=need;
}else
{ }
}
return 1.000000*mid*p-sum>0.000000;
}
int main()
{
gg(n),gg(p);
ll sum=0ll;
repd(i,,n)
{
gg(a[i].x);
gg(a[i].h);
sum+=(1ll*a[i].x);
}
if(sum<=p)
{
printf("-1\n");
}else
{
double l=0.0000;
double r=1e10;
double mid;
double ans;
while(r-l>eps)
{
mid=(r+l)/2.00000;
if(check(mid))
{
l=mid;
ans=l;
}else
{
r=mid-eps;
}
}
printf("%.5lf\n", ans);
} return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
Voltage Keepsake CodeForces - 801C (思维+二分)的更多相关文章
- Voltage Keepsake CodeForces - 801C (贪心 || 二分)
C. Voltage Keepsake time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Voltage Keepsake CodeForces - 801C(思维)
题意: 有n台机器,第i台机器每个单位时间消耗ai的功率,初始有bi的功率储备,有一个充电器每个单位时间充p单位的功率 问经过多长时间才能有一个功率位0的机器,如果能够无限使用输出-1: 解析: 时间 ...
- Present CodeForces - 1323D (思维+二分)
题目大意比较简单,就是求一堆(二元组)的异或和. 思路:按位考虑,如果说第k位为1的话,那么一定有奇数个(二元组)在该位为1.二元组内的数是相加的,相加是可以进位的.所以第k位是0还是1,至于k为后边 ...
- Codeforces 801C - Voltage Keepsake
C. Voltage Keepsake 题目链接:http://codeforces.com/problemset/problem/801/C time limit per test 2 second ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) C Voltage Keepsake
地址:http://codeforces.com/contest/801/problem/C 题目: C. Voltage Keepsake time limit per test 2 seconds ...
- Codeforces801C Voltage Keepsake 2017-04-19 00:26 109人阅读 评论(0) 收藏
C. Voltage Keepsake time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- codeforces 1165F1/F2 二分好题
Codeforces 1165F1/F2 二分好题 传送门:https://codeforces.com/contest/1165/problem/F2 题意: 有n种物品,你对于第i个物品,你需要买 ...
- Codeforces 801C Voltage Keepsake(二分枚举+浮点(模板))
题目链接:http://codeforces.com/contest/801/problem/C 题目大意:给你一些电器以及他们的功率,还有一个功率一定的充电器可以给这些电器中的任意一个充电,并且不计 ...
- Codeforces Round #409 C. Voltage Keepsake(二分+思维)
题目链接:http://codeforces.com/contest/801/problem/C 题意:给出一个充电器每秒钟充p个点,还有n个电器要同时使用a[i]表示第i个电器每秒钟用多少点,b[i ...
随机推荐
- arcgis如何求两个栅格数据集的差集
栅格数据集没有擦除功能,现在有栅格A和栅格B,怎么求两个栅格的差集C 具体步骤如下: 1.首先利用栅格计算器,把栅格B中的value全部赋值为0 输入语句:"栅格B" * 0 2 ...
- 【NOIP2017D2T3】列队
Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia所在的方阵中有n × m名学生,方阵的行数为 n, ...
- python五十六课——正则表达式(常用函数之compile())
2).compile(regex,[flags=0]):返回一个Pattern对象(认为:它内部已经封装了一套regex和flags) 可以再通过Pattern对象继续调用match函数(此时只需要传 ...
- (13)Python文件操作
- Js 不支持函数的重载
Js 不支持函数的重载,可以用相同的名字在同一作用区域,定义两个函数,而不会引起错误,但真正使用的是最后一个. Js 不会验证传递给函数的参数个数是否和函数定义的参数的个数相同,开发人员定义的函数都可 ...
- jquery ajax 方法实例
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 直接上代码, ajax实例: $.ajax({ type : & ...
- P1387 最大正方形
2018-08-16 https://www.luogu.org/problemnew/show/P1387 题意: 略. 4 4 0 0 1 1 把这个翻译成dp的形式 0 0 1 1 ...
- CSS三栏布局
一.绝对定位 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- UCML异常提示:无效URI
UCML异常提示界面,点击确定后UCML退出无法使用,原因见图二 图一: 图二:源码路径错误导致找不到路径出异常提示,在数据库中将数据update回正确路径即可解决该问题
- docker官方文档学习-1-Docker for mac安装配置
https://docs.docker.com/docker-for-mac/ Get started with Docker for Mac 首先像在本博客docker-1-环境安装及例子实践处将环 ...