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 ...
随机推荐
- vue-cli打包到部署到nginx服务器
最近公司把云平台产品用vue 前后端分离的框架来写,前面大部分开发都比较顺利,后面打包部署出了bug 现在记录下自己遇到的哪些坑 1,我直接npm run build 打包出来,打开dist目录下面的 ...
- .whl文件打开方式 Python
wheel文件本质上就是zip或者rar,只不过他更加方便python的安装以及使用.在之前的图片中我们只要使用pip install wheel 就可以安装wheel. 在安装了wheel之后我们可 ...
- 阿里巴巴Web前端面试的一道JS题目,求解答!!!
题目大概是这种: function outer(){ return inner; var inner = "a"; function inner(){}; inner = 9; } ...
- 如何正確的使用 Runtime.exec()
或許大部分有寫過Java程式的人都知道java.lang.Runtime這個class有一個method叫做exec(),可以被用來呼叫(調用)外部的程式.然而大部分的人都不知道這個method存在著 ...
- Arduino IDE for ESP8266 项目云盒子(2)一键自配置+网页服务器
https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=521945102409&ns=1&abbucket= ...
- day12 Python数字,字符串,列表,元祖,字典总结
一.数字 int() 二.字符串 replace/find/join/strip/startswith/split/upper/lower/format tempalte = "i am { ...
- P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)
阅读目录 一:vue-router是什么? 二:vue-router的实现原理 三:vue-router使用及代码配置 四:理解vue设置路由导航的两种方法. 五:理解动态路由和命名视图 六:理解嵌套 ...
- SkylineGlobe MFC C++ 开发示例代码
SkylineGlobe的SDK底层是跨平台的C++内核,面向不同平台封装原生的API,具有很高的执行效率, 下面是C++二次开发时的示例代码: #import "D:\Program Fi ...
- C# 邮箱的使用
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configurat ...