Fight against involution
from 2020ICPC济南
Time limit:1s
Memory limit:256MB
题意:
在满足每个人成绩不减的前提下,找到最小的wi的总和。
贪心,因为每个人最开始的时候都是想着把自己的字数写到最多(wi = Ri)
我们可以将每个人按照Ri升序排列,Ri相同按照Li降序,这样每个人都比后面的人字数少,但是我们想要将wi的总和降到最低,
并且每个人wi大于等于前一个人并且小于等于后一个人。
从1到n遍历每个人,用mx记录前面的人字数最大值,wi要大于等于这个值
所以:mx = max(mx,Li) (mx是当前人能写的最小字数)
wi = mx
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define start ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long long
#define pii pair<int,int>
pii p[100005];
int n;
int sum;
bool cmp(pii a,pii b){
if(a.second == b.second)
return a.first > b.first;
return a.second < b.second;
}
signed main(){
start;
cin>>n;
for(int i = 1;i <= n;++i)
cin>>p[i].first>>p[i].second;
int mx = 0;
sort(p + 1,p + 1 + n,cmp);
for(int i = 1;i <= n;++i){
mx = max(mx,p[i].first);
sum += mx;
}
cout<<sum;
return 0;
}