Codeforces Round #661 (Div. 3)B. Gifts Fixing(详解)

题目链接
题意
给定A和B两个序列,每次可以执行下面三个步骤中的一个

1.将A序列中元素减一
2.将B序列中元素减一
3.同时将A和B序列中元素减一
问你使得A,B序列中元素一样,最少要多少步。
思路
这个题目关键在于要同时对两个数组进行操作才可能满足最小步骤
1.将两个数组中最小的数先找出来
2.如果当前两个数组的当前元素都大于各自的最小值则执行上述的第三步
3.否则根据情况执行1或2步
最大值可以表示为 0x7fffffff

#include
#include
#include
#include 
using namespace std;
const int maxn = 1000;
int a[maxn];
int b[maxn];
int main() {
	int n;
	int t;
	cin >> n;
	long long step1, step2, step;
	while (n--) {
		cin >> t;
		int min1=0x7fffffff;//先将最小值置为最大值
		int min2 =0x7fffffff;
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		step = 0;
		for (int i = 0; i < t; i++) {
			cin >> a[i];
			if (a[i] < min1) {
				min1 = a[i];
			}
		}
		for (int i = 0; i < t; i++) {
			cin >> b[i];
			if (b[i] < min2) {
				min2 = b[i];
			}
		}
		for (int i = 0; i < t; i++) {
		//这里是对上述思路的一个简化代码,每一次执行的步骤就是数组A和数组B中最大执行步骤,假如数组A的当前元素执行5次数组B3次,那么可以先共同执行3次,在对数组A执行2次
				step1 = a[i] - min1;
				step2 = b[i] - min2;
				step += max(step1, step2);
		}
		cout << step << endl;
	}
}

你可能感兴趣的:(codefoces)