日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心)

發布時間:2023/12/3 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

G-Game of Swapping Numbers

講題人做法

最優解轉化:

考慮任意一個最優解,我們把交換后的數字重新放回原來的位置,相當于為每一個元素分配了它在答案中的符號。比如 A={0, 3}, B = {1, 2},最優解符號分配是 A={-0,+3}, B={-1,+2}。

考察符合要求的解符號分配規則,其實只要滿足 A, B 中正號總和和負號總和相等,而 A、B 各自的正負號可以不一樣。
注意:有可能出現正負號和實際絕對值相反的情況,這樣如果不交換答案會更劣,我們求最優解不會影響。轉化后的問題和原問題不完全相同,但是最優解相同!!!


結論:n>2時,恰好 k 步與至多 k 步是等價的,當 n>2 時,A 中一定至少存在兩個 + 號或兩個 - 號,此時如果我們交換這兩個符號對應的數,則并不會使得原問題的解變得更劣。n=2 需要特殊判斷。

求最優對換解:
考慮對于 AiA_iAi?AjA_jAj?,如果需要答案變優,則需要兩個區間沒有交(區間是[min?(Ai,Bi),max?(Ai,Bi)][\min(A_i,B_i),\max(A_i,B_i)][min(Ai?,Bi?),max(Ai?,Bi?)]畫畫圖即可看出),并且變優 2×[min?(Ai,Bi)?max?(Aj,Bj)]2×[\min(A_i,B_i) - \max(A_j, B_j)]2×[min(Ai?,Bi?)?max(Aj?,Bj?)]。因此只需要將所有的 2×min?(Ai,Bi)2×\min(A_i, B_i)2×min(Ai?,Bi?)2×max?(Ai,Bi)2×\max(A_i, B_i)2×max(Ai?,Bi?)排序,依次取前 kkk 大相減取和即可。

#include<bits/stdc++.h>using namespace std; using ll=long long;constexpr int N=200010; int n,K; int A[N],B[N]; int dmin[N],dmax[N]; int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>K;for(int i=1;i<=n;i++) cin>>A[i];for(int i=1;i<=n;i++) cin>>B[i];ll ans=0;if(n==2&&(K&1)) swap(A[1],A[2]);for(int i=1;i<=n;i++) ans+=abs(A[i]-B[i]);if(n<=2) return cout<<ans<<'\n',0;for(int i=1;i<=n;i++){dmin[i]=2*min(A[i],B[i]);dmax[i]=2*max(A[i],B[i]);}sort(dmin+1,dmin+1+n,[&](int a,int b){return a>b;});//從大到小sort(dmax+1,dmax+1+n);// 從小到大ll cur=ans;for(int i=1;i<=n&&i<=K;i++) //前k大{cur+=dmin[i]-dmax[i];ans=max(ans,cur);}cout<<ans<<'\n';return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。