标签:bsp asc pac cas 大小 ble spl pre event
题目大意:
给定N F 给定N个水池的大小
每个水池都以流量F开始注水
当位置较前的水池注满后 水会溢出到下一个水池
求 最后一个水池开始溢出的时间 和 所有水池全部注满的时间
1.最后一个n水池开始溢出的时间
当 n-1水池 还没溢出 而 n水池 溢出了,说明 n水池 溢出的时间只取决于它自己
当 n-1水池 溢出了 而 n水池 还没溢出时,说明 n-1水池 会影响 n水池 的溢出
而 n-2水池 和 n-1水池 同样如此
由于流量固定为F 此时假设
n-2水池 不影响 n-1水池 的溢出,而 n-1水池 会影响 n水池 时
那么平均一个水池的时间花费为 (n-1容量+n容量)/ F / 2,即最后一个水池开始溢出的时间
从后开始考虑 即考虑 i水池 到 n水池 有影响
那么求得的最小的平均单水池花费 就是 n水池开始溢出的时间
2.所有水池全部注满的时间
由于水只会向后溢出 故所有水池注满的时间较受前面的水池的影响
当 1水池 还未注满 而 2~n水池 已经注满,说明全部水池注满的时间取决于 1水池
同理 当 1~i水池未注满 而 i+1~n水池 已注满,说明全部水池注满的时间取决于 1~i水池的平均单水池花费
那么从前开始考虑 即考虑 1~i水池还未注满而后面的水池都已注满
那么求得的 1~i水池 的最大的平均单水池花费就是 所有水池全部注满的时间
#include <bits/stdc++.h> using namespace std; #define LL long long #define INF 0x3f3f3f3f #define mem(i,j) memset(i,j,sizeof(i)) #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,r,l) for(int i=r;i>=l;i--) #define gcd(i,j) __gcd(i,j); const int N=1e5+5; const int mod=1e9+7; const double eps=1e-8; int n; LL v, c[N]; int main() { while(~scanf("%d%lld",&n,&v)) { inc(i,1,n) scanf("%lld",&c[i]); double ans1=INF,ans2=-INF; LL sum=0; dec(i,n,1) { sum+=c[i]; double t=(double)sum/(double)(n-i+1)/(double)v; ans1=min(ans1,t); } sum=0; inc(i,1,n) { sum+=c[i]; double t=(double)sum/(double)i/(double)v; ans2=max(ans2,t); } printf("%lf %lf\n",ans1,ans2); } return 0; }
CTU OPEN 2017 Pond Cascade /// 思维
标签:bsp asc pac cas 大小 ble spl pre event
原文地址:https://www.cnblogs.com/zquzjx/p/10546968.html