日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unfair contest(个人做法)

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

  • 對于第一個人c<s,對于第二個人c<s,此時去掉最高分t,去掉最低分c(對于兩個人都是)
  • 對于第一個人c<s,對于第二個人c>t
  • 對于第一個人c<s,對于第二個人s<c<t
  • 對于第一個人s<c<t,對于第二個人c<s
  • 對于第一個人s<c<t,對于第二個人s<c<t
  • 對于第一個人s<c<t,對于第二個人c>t
  • 對于第一個人c>t,對于第二個人c<s
  • 對于第一個人c>t,對于第二個人s<c<t
  • 對于第一個人c>t,對于第二個人c>t

    我們先把藍色部分統計好,然后分九種情況依次去判斷是否符合要求,記錄最大差值,一定不重不漏。
    分類討論每種情況下的最大差值,很麻煩,我和隊友一點點分析才寫完。
    但是一直wa,因為我們忘了特判s=0,t=0的各種情況,如果s=0,t=0,說明不用去掉最大最小值,此時最左側和最右側時c的取值情況,在完成初始化后,依舊判斷。初始化0和n+1的情況,因為這是c的取值
  • a[0]=1;a[n+1]=h;b[0]=1;b[n+1]=h;

    我也說不上明白,我們這個方法很麻煩,但是能做出來,詳細看看代碼理解

    代碼:

    #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(个人做法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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