Codeforces Round #661 (Div. 3) 参与排名人数12987
[codeforces 1399B] Gifts Fixing 寻找最小值+寻找最大差值
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1399/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Gifts Fixing | GNU C++17 | Accepted | 15 ms | 3600 KB |
题目大意:均分礼物,提供n个礼物,每个礼物由糖果,桔子组成,要求最后分配到每个人手上的糖数量相等,桔子数量相等。
每次可以这样操作,要么同一种礼物中的糖数量减少1,要么同一种礼物中的桔子数量减少1,要么同一种糖与桔子数量均较少1.
要求,算出最少操作次数。
基本思路:部分样例模拟如下:
3
3 5 6
3 2 36位置1 2 3
糖糖3 5 6 最终所有位置糖的数量都是3
桔子3 2 3 最终所有位置桔子的数量都是2位置 1 2 3
糖糖 3 5 6 最终所有位置糖的数量都是3
差值 3-3=0 5-3=2 6-3=3
桔子 3 2 3
差值 3-2=1 2-2=0 3-2=1 最终所有位置桔子的数量都是2
操作次数max(0,1)=1 max(2,0)=2 max(3,1)=3 总操作次数1+2+3=6
样例模拟如下:
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int a[55],b[55];
int main(){int t,n,i,aa,bb;LL cnt;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++)scanf("%d",&b[i]);aa=bb=1000000000,cnt=0;for(i=1;i<=n;i++)aa=min(aa,a[i]);//查找a[i]最小值for(i=1;i<=n;i++)bb=min(bb,b[i]);//查找b[i]最小值for(i=1;i<=n;i++)cnt+=max(a[i]-aa,b[i]-bb);//查找同一位置上操作数的最大值printf("%lld\n",cnt);}return 0;
}