icpc:problems:usaco22jan_drought_b
problems | |
---|---|
名称 | Drought B |
题目编号 | USACO22JAN_B3 |
题目链接 | luogu.com.cn/… |
来源 | USACO |
算法分类 | 贪心, 思维 |
难易程度 | 一般般 |
Drought B
想法
既然要把所有的值都降成一样的,那必须把所有的高度差消除,对于i来说,左边的相差只能从右弥补,右边的相差只能从左弥补。所以先从左往右,把i与i-1的差距弥补了,然后再逆过来把i与i+1的差距弥补了。如果左右端点任意一个被减成负数,那就说明不行。
不过需要注意:
- n等于1与2的特殊判断
- long long int
代码实现
#include<iostream> #include<vector> using namespace std; int main() { int T; cin >> T; while(T--) { int n; cin >> n; vector<long long int>line(n); for (int i = 0; i < n; ++i) cin >> line[i]; if(n == 1) { cout << 0 << endl; continue; } if((n == 2 && line[0] != line[1]) || line[0] > line[1] || line[n-1] > line[n-2]) { cout << -1 << endl; continue; } long long int cnt = 0; for (int i = 1; i < n-1; ++i) { if(line[i] > line[i-1]) { long long int def = line[i] - line[i-1]; cnt += 2 * def; line[i+1] -= def; line[i] -= def; } } for (int i = n-2; i > 0; --i) { if(line[i] > line[i+1]) { long long int def = line[i] - line[i+1]; cnt += 2 * def; line[i-1] -= def; line[i] -= def; } } if(line[0] < 0 || line[n-1] < 0) cnt = -1; cout << cnt << endl; } return 0; }
/app/www/public/data/pages/icpc/problems/usaco22jan_drought_b.txt · 最后更改: 2023/02/07 09:28 由 温婕莺