由于题面$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}$就好了。
代码:
#include<bits/stdc++.h> #define il inline #define ll long long #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)>(b)?(b):(a)) using namespace std; ll n,a[100005],r[100005]; double w[100005]; il int gi(){ int a=0;char x=getchar();bool f=0; while((x<'0'||x>'9')&&x!='-')x=getchar(); if(x=='-')x=getchar(),f=1; while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar(); return f?-a:a; } int main(){ n=gi(),w[0]=gi(); int u,v,c; For(i,1,n) w[i]=gi(),r[i]=gi(); int p=0; For(i,1,n){ while(p+1<=r[i])p++,w[0]+=w[p]; w[0]-=w[i]*5; if(w[0]<0){printf("-1");return 0;} } while(p+1<=n)p++,w[0]+=w[p]; printf("%.8lf",w[0]/5); return 0; }