题目: 题目链接 https://cn.vjudge.net/problem/Gym-101670B
思路: 题目让求最下面池子满的时间和所有池子满的时间, 首先我们考虑所有池子满的时间, 我们从上到下考虑, 因为某些池子满了之后溢出只能往下溢水, 考虑当前池子如果注满时间最长, 那么从第一个池子到当前池子容量之和与流速之和之比是一样的, 随着数据读入处理一遍即可得出最大的注满时间, 即注满全部池子的时间, 接下来我们考虑最下方池子的注满时间, 这个时间不会大于单独给这个池子注满的时间, 同样的, 不会大于给最下方池子和他上面那一个池子一块拿出来后最下方池子的注满时间, 反着扫描一遍, 就可以得出结果.
AC 代码:
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- #include <vector>
- #include <string>
- #include <queue>
- #include <map>
- #include <set>
- #define FRER() freopen("in.txt", "r", stdin);
- #define INF 0x3f3f3f3f
- using namespace std;
- int main()
- {
- //FRER()
- int n, num[100005];
- double m, minans, sumans, sum, sumv;
- while(~scanf("%d %lf", &n, &m)) {
- scanf("%d", &num[0]);
- sum = 1.0 * num[0];
- sumv = m;
- sumans = sum / sumv;
- for(int i = 1; i < n; ++i) {
- scanf("%d", &num[i]);
- sum += 1.0 * num[i];
- sumv += m;
- sumans = max(sumans, sum / sumv);
- }
- sum = 1.0 * num[n - 1];
- sumv = m;
- minans = sum / sumv;
- for(int i = n - 2; ~i; --i) {
- sum += 1.0 * num[i];
- sumv += m;
- minans = min(minans, sum / sumv);
- }
- printf("%.8f %.8f\n", minans, sumans);
- }
- return 0;
- }
来源: https://www.cnblogs.com/fan-jiaming/p/9833987.html