
题目链接https://codeforces.com/contest/2238/problem/A题目大意给定两个数组ab现在我们需要对a数组进行以下两个操作让其变为b数组-选择a[i](1in)使得a[i]变为a[i]-1,所耗费时间为1s-对a数组进行任意方式进行重新排列所耗费时间为Cs现在要我们求出最少耗费时间如果没有合理方案则输出-1题目思路我们可以先判断是否存在合法方案那么我们可以对ab数组进行排序在排序之前我们定义cd两个数组记录未排序的ab数组只要a数组中有任意一个元素是小于b中对于下标元素那么就一定不合法反之则一定存在合法方案接着我们就可以分情况对ans计数了必须要排列是一种情况不需要排列和可能排列又是一种情况取最小值代码如下#includebits/stdc.h using namespace std; //#define int long long #define endl \n void solve(){ int n, c; cinnc; vectorint a(n),b(n); for(int i0;in;i){ cina[i]; } for(int i0;in;i){ cinb[i]; } vectorint c1(n), d(n); c1 a; d b; sort(a.begin(),a.end()); sort(b.begin(),b.end()); for (int i 0; i n;i){ if(a[i]b[i]){ cout -1 endl; return; } } int ans 0; int flagtrue; for (int i 0; i n;i){ if(c1[i]d[i]){ ans(c1[i]-d[i]); continue; } if(c1[i]d[i]){ flagfalse; break; } } //coutansendl; //coutflag: flagendl; if(flag){ int ans2 0; for (int i 0; i n;i){ ans2(a[i]-b[i]); } int res min(ans2 c, ans); cout res endl; }else{ int ans2 0; for (int i 0; i n;i){ ans2(a[i]-b[i]); } cout ans2 c endl; } } signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int T; cinT; while(T--){ solve(); } return 0; }