题目说 0≤Ai,Bi<M,有两种情况。
- Ai+Bi<M,对答案贡献为 Ai+Bi。
- Ai+Bi≥M,即 M≤Ai+Bi<2M,对答案贡献为 Ai+Bi−M。
所以对答案的贡献不是 Ai+Bi 就是 Ai+Bi−M。
答案的柿子就变成了这样:
(i=1∑N(Ai+Bi))−kM
其中 k 是有多少对 Ai+Bi≥M。
为了让答案最小,即 k 要尽可能地大。
我们可以先排序,然后用双指针来求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<bits/stdc++.h> using namespace std; #define int long long int n,m,a[314514],b[314514],ans; void fkM28(){ ans=0; cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i],ans+=a[i]; for(int j=1;j<=n;j++)cin>>b[j],ans+=b[j]; sort(a+1,a+n+1),sort(b+1,b+n+1); for(int i=1,j=n;i<=n;i++) if(a[i]+b[j]>=m) j--,ans-=m; cout<<ans<<"\n"; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t; cin>>t; while(t--)fkM28(); return 0; }
|