Unfair contest(个人做法)
生活随笔
收集整理的這篇文章主要介紹了
Unfair contest(个人做法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Unfair contest
題意:
兩個人參賽,n個評委打分,去掉s個最高分,去掉t個最低分,剩下分求平均分,平均分大的獲勝。你是第n個評委,此時已知前n-1個評委所打分數,現在輪到你打分,要求你在保證第一個人獲勝的情況下,使得a-b最小(a為你給第一個人打的分數,b為你給第二個人打的分數)
題解:
我和隊友是這樣想的:
目前已經有n-1對分數已經確定,此時要去掉s個最高分,t個最低分,那我們將最高的s-1個分數舍棄,最低的t-1個舍去,因為無論第n個人怎么取分,都必然要舍去。好,現在問題就成了,剩下成績中要去掉一個最高分,一個最低分,然后問第n個人如何打分?
因為第n個人不知道他打分如何?他的打分決定了到底哪個最大值和最小值被舍棄,有可能是第n個的成績被舍棄,也有可能是之前成績的最高分被舍棄,因此需要我們去分類討論
九種情況(對于第一個人三種情況,第二個人三種情況),三種分別是:c在s后,c在st之間,c在t后,我們簡稱第n個人的評分為c,之前n-1個成績的最高分和最低分分別是s和t
我們先把藍色部分統計好,然后分九種情況依次去判斷是否符合要求,記錄最大差值,一定不重不漏。
分類討論每種情況下的最大差值,很麻煩,我和隊友一點點分析才寫完。
但是一直wa,因為我們忘了特判s=0,t=0的各種情況,如果s=0,t=0,說明不用去掉最大最小值,此時最左側和最右側時c的取值情況,在完成初始化后,依舊判斷。初始化0和n+1的情況,因為這是c的取值
我也說不上明白,我們這個方法很麻煩,但是能做出來,詳細看看代碼理解
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+10; const int inf=0x3f3f3f3f; ll T,s,t,h,n; ll a[maxn]; ll b[maxn]; int main() {//freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); cin>>T;while(T--){cin>>n>>s>>t>>h;swap(s,t);int flag=0;ll ans=inf;for(int i=1;i<=n-1;i++)scanf("%d",&a[i]);for(int i=1;i<=n-1;i++)scanf("%d",&b[i]);sort(a+1,a+n);sort(b+1,b+n);ll upqd=0;ll dwqd=0;n--;a[0]=1;a[n+1]=h;b[0]=1;b[n+1]=h; for(int i=s+1;i<=n-t;i++){upqd+=a[i];dwqd+=b[i];}ll tupqd=upqd;ll tdwqd=dwqd;//1 s stupqd=upqd+a[s];tdwqd=dwqd+b[s];if(tupqd>tdwqd){flag=1;ans=min(ans,1-b[s]);}//2 s ttupqd=upqd+a[s];tdwqd=dwqd+b[n-t+1];if(tupqd>tdwqd){flag=1;ans=min(ans,1-h);}//cout<<flag<<endl;//3 s ctupqd=upqd+a[s];tdwqd=dwqd;//cout<<tupqd<<" "<<tdwqd<<endl;//cout<<flag<<endl;if(tupqd>tdwqd+b[s]){flag=1;ll tmp=min(tupqd-tdwqd-1,b[n-t+1]);ans=min(ans,1-(tmp));//}//4 c s//cout<<flag<<endl;tupqd=upqd;tdwqd=dwqd+b[s];if(tupqd+a[n-t+1]>tdwqd){flag=1;ll tmp=max(tdwqd-tupqd+1,a[s]);ans=min(ans,tmp-b[s]);}//5 c c//cout<<ans<<endl;tupqd=upqd;tdwqd=dwqd;if(tupqd+a[n-t+1]>tdwqd+b[s]){flag=1;ll tmp=max((tdwqd-tupqd)+1,a[s]-b[n-t+1]);ans=min(ans,tmp);}//6 c ttupqd=upqd;tdwqd=dwqd+b[n-t+1];if(tupqd+a[n-t+1]>tdwqd){flag=1;ll tmp=max(a[s],tdwqd-tupqd+1);ans=min(ans,tmp-h);}//7 t stupqd=upqd+a[n-t+1];tdwqd=dwqd+b[s];if(tupqd>tdwqd){flag=1;ans=min(ans,a[n-t+1]-b[s]);}//8 t ctupqd=upqd+a[n-t+1];tdwqd=dwqd;if(tupqd>tdwqd+b[s]){flag=1;ll tmp=min((tupqd-tdwqd-1),b[n-t+1]);ans=min(ans,a[n-t+1]-tmp);}//9 t ttupqd=upqd+a[n-t+1];tdwqd=dwqd+b[n-t+1];if(tupqd>tdwqd){flag=1;ans=min(ans,a[n-t+1]-h);}if(flag)cout<<ans<<endl;else cout<<"IMPOSSIBLE"<<endl;}return 0; }總結
以上是生活随笔為你收集整理的Unfair contest(个人做法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #73
- 下一篇: Educational Codeforc