P4712 「生物」能量流动
Posted five20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4712 「生物」能量流动相关的知识,希望对你有一定的参考价值。
由于题面$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 「生物」能量流动的主要内容,如果未能解决你的问题,请参考以下文章