Fight against involution
生活随笔
收集整理的這篇文章主要介紹了
Fight against involution
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
對抗內卷(大佬經常說別再卷了)
有一門課程n個學生選,期末要寫一篇論文每個同學寫的字數有一個下限和一個上限,課程的成績是按學生字數的排名來給分的,排名越高分數越高,每個同學都想得到更高的成績,而且他們都想寫最少字數,那么在滿足每個同學不能比原計劃分數低的情況下求出所有同學總共要寫的最少字數。
題解:
本題的關鍵在于要理解“不能比原計劃的分數低”,我認為是“戰勝該戰勝的人”,也就是如果有的人自己肯定能超過,那就一定要超過,還是不明白繼續看
如果A的上限大于B的上限,那么B永遠不能超過A,只要A的字數比B的上限高即可。也就是說對于A來說B是肯定能超過的人
如果兩個人的上限一樣,那么就比下限,如果AB上限一樣,A的下限比B的更低,為了讓大家的字數都少,B就取下限,A也取下限。(B的下限是在A的范圍內的,而反過來不對),也就是說當兩個人不存在絕對優勢時,不如大家寫的一樣少,即提高了排名又少了字數
現在我們根據這兩個規則來確定排名(含并):按照上限降序,當上限一樣時按照下限升序,這樣的排序結果基本上就是他們的排名
規定一個最小字數mini,我們從最后一名同學開始,如果該同學的下限小于mini,那么他就寫mini的字數,如果大于mini(說明該同學無法寫到mini的子樹),該同學只能寫自己下限的字數,并維護新的mini,這樣進行
代碼:
#include<bits/stdc++.h>using namespace std;struct node{long long a;long long b;node(){}node(long long aa,long long bb){a=aa;b=bb;}};bool cmp(node node1,node node2){if(node1.b==node2.b)return node1.a<node2.a;//下限從小到大 elsereturn node1.b>node2.b;//上限從大到小 }int main(){int n;long long ans;ans=0;node N[100005];cin>>n;for(int i=0;i<n;i++){long long aa,bb;cin>>aa>>bb;N[i]=node(aa,bb);}sort(N,N+n,cmp);long long minword=N[n-1].a;ans+=minword;for(int i=n-2;i>=0;i--){if(minword>=N[i].a){ans+=minword;}else{minword=N[i].a;ans+=minword;} }cout<<ans<<endl;return 0;}總結
以上是生活随笔為你收集整理的Fight against involution的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博美犬性格是什么 博美犬性格简述
- 下一篇: 网状的排烟罩的清洗方法 网状的排烟罩如何