璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:usaco22jan_drought_b
problems
名称Drought B
题目编号USACO22JAN_B3
题目链接luogu.com.cn/…
来源USACO
算法分类贪心, 思维
难易程度一般般

Drought B

想法

既然要把所有的值都降成一样的,那必须把所有的高度差消除,对于i来说,左边的相差只能从右弥补,右边的相差只能从左弥补。所以先从左往右,把i与i-1的差距弥补了,然后再逆过来把i与i+1的差距弥补了。如果左右端点任意一个被减成负数,那就说明不行。

不过需要注意:

  1. n等于1与2的特殊判断
  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 由 温婕莺