码迷,mamicode.com
首页 > 其他好文 > 详细

P4712 「生物」能量流动

时间:2018-06-19 16:28:35      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:def   rac   target   inline   clu   getch   min   names   double   

由于题面$markdown$格式,博主太懒不想一个一个改,所以题面见此:

 

Solution:

  本题的贪心思路比较有意思,完全考读题。。。

  首先,因为总的能量来源是$a[0]$,所以可以理解为总能量守恒(不计损失),又$r[i]\leq r[i+1]$,所以满足第$i+1$只动物需求的前提是必须先满足第$i$只动物需求,那么我们就可以根据题意模拟了。

  从前往后扫一遍,到了第$i$只动物时,假设前$r[i]$只满足需求,直接累加前$r[i]$只的总能量(由于$r[i]$单调不下降,所以用一个指针$p$不停后移就好了),若不满足当前第$i$只动物的需求,直接输出$-1$,否则就减去消耗,继续模拟。

  最后输出的就是当前所剩的总能量的$\frac{1}{5}$就好了。

代码:

 1 #include<bits/stdc++.h>
 2 #define il inline
 3 #define ll long long
 4 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 5 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
 6 #define Max(a,b) ((a)>(b)?(a):(b))
 7 #define Min(a,b) ((a)>(b)?(b):(a))
 8 using namespace std;
 9 ll n,a[100005],r[100005];
10 double w[100005];
11 
12 il int gi(){
13     int a=0;char x=getchar();bool f=0;
14     while((x<0||x>9)&&x!=-)x=getchar();
15     if(x==-)x=getchar(),f=1;
16     while(x>=0&&x<=9)a=(a<<3)+(a<<1)+x-48,x=getchar();
17     return f?-a:a;
18 }
19 
20 int main(){
21     n=gi(),w[0]=gi();
22     int u,v,c;
23     For(i,1,n) w[i]=gi(),r[i]=gi();
24     int p=0;
25     For(i,1,n){
26         while(p+1<=r[i])p++,w[0]+=w[p];
27         w[0]-=w[i]*5;
28         if(w[0]<0){printf("-1");return 0;}
29     }
30     while(p+1<=n)p++,w[0]+=w[p];
31     printf("%.8lf",w[0]/5);
32     return 0;
33 }

 

P4712 「生物」能量流动

标签:def   rac   target   inline   clu   getch   min   names   double   

原文地址:https://www.cnblogs.com/five20/p/9198229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!