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=1000010; 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,1,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,1,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 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }
View Code
转载于:https://www.cnblogs.com/qieqiemin/p/10236751.html
Voltage Keepsake CodeForces - 801C (思维+二分)相关推荐
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)C. Voltage Keepsake
题目链接:C. Voltage Keepsake 题解:二分时间,然后判断看需要充电的时间总和是否在允许的范围内 #include<bits/stdc++.h> #define pb pu ...
- CodeForces - 801C Voltage Keepsake(二分)
题目链接:点击查看 题目大意:给出n个电器,每个电器每秒钟都需要消耗一定的能量,每个电器初始时储存了一定的能量,现在有一个充电器,可以给任意一个电器充电,问这n个电器最多能运行多久 题目分析:看到这个 ...
- CodeForces - 801C Voltage Keepsake 二分
You have n devices that you want to use simultaneously. The i-th device uses ai units of power per s ...
- Codeforces Round #409 (Div. 2) C Voltage Keepsake(二分)
题意:有n(n<=100000)个机器...第i个机器最开始有bi(1<=bi <= 100000)个单位的电量,机器可以储存的电量没有上限,启动后每秒消耗ai(1<=ai&l ...
- CF思维联系– CodeForces - 991C Candies(二分)
ACM思维题训练集合 After passing a test, Vasya got himself a box of n candies. He decided to eat an equal am ...
- Codeforces 895 B XK Segments 思维 二分
题目链接: http://codeforces.com/contest/895/problem/B 题目描述: 给你长度为n的数列a,然后让你找出所有的对(i,j)满足ai≤aj并且[ai,aj]中能 ...
- CodeForces - 51C 修信号站_思维+二分答案
题目 给你x轴上的n个点,可以用三段相同长度的区间进行覆盖,问你这三个区间的最小长度是多少,并输出三段区间的中点. 求解 前半个问题应该不难,直接二分答案即可,后半个问题则有些思维成分.另外,这题让我 ...
- Anton and Fairy Tale CodeForces - 785C(二分+思维)
Anton likes to listen to fairy tales, especially when Danik, Anton's best friend, tells them. Right ...
- Educational Codeforces Round 53C(二分,思维|构造)
#include<bits/stdc++.h> using namespace std; const int N=1e6+6; int x[N],y[N]; int sx,sy,n; ch ...
最新文章
- 计算机网络基础 — 网络设备转发原理
- java多线程解读一(基础篇)
- 【康复训练】[国家集训队] calc【dp】【拉格朗日插值】
- 用java实现学生管理系统
- Kibana:Drilldown 中的 URL 模板
- 计算机isas测试,SAS硬盘测试:15,000转对决10,000转
- 200 OK(from memory cache)和 200 OK(from disk cache)
- ShareSDK分享 和新浪登陆冲突解决方法
- QT实现MP3播放器的歌词同步显示(卡拉OK功能)
- 医药产品经理ims数据分析
- chrome插件实现简单网页实时翻译
- iPhone更换电池是原装还是第三方?先别着急决定,看完文章再给答案
- AD18添加LOGO图标更改大小
- 比较两组数据的差异用什么图更直观_用好这11种可视化图表,数据可视化技能秒提升...
- 微信小程序商城如何打印快递单
- 十大股票资讯网站排名 炒股资讯网站排行榜 炒股必看的资讯网站推荐
- C++开源游戏推荐,植物大战僵尸(Cocos2dx开源项目)
- html页面控制标签,html常用标签大全
- 5G标准化进程加速:高通下半年启动新空口试验及互操作性测试
- 2022年全球市场化学机械抛光(CMP)金刚石衬垫调节器总体规模、主要生产商、主要地区、产品和应用细分研究报告