题目描述
用例
输入1
3
1 10000
1 10000
1 10000
输出1
3
输入2
4
1 2
2 2
2 4
3 4
输出2
10
这是一个比较有意思的题目,大概意思是说,有一门课程n个学生选,期末要写一篇论文每个同学写的字数有一个下限和一个上限,课程的成绩是按学生字数的排名来给分的,排名越高分数越高,每个同学都想得到更高的成绩,而且他们都想写最少字数,那么在满足每个同学不能比原计划分数低的情况下求出所有同学总共要写的最少字数。
看完题目后有思路,但一下没有理解比原计划的分数低这个意思,认为是所有学生的排名尽可能的高,认为更多人字数一样那么他们的分数也会越高这样一个死胡同里面,提交错了2次,重新读题分析理解后,还是按上限降序,当上限相等时下限升序,这样排序后的顺序基本就是他们的成绩。将最后一个同学的下限当作最小初始值minword,从最后一名开始,如果当前学生下限小于minword,该同学就写minword的字数,如果前面学生下限大于minword,该学生只能写下限的字数,并将下限赋值给minword,维护minword。计算所有学生的最小字数和即为所求。
内卷,非理性的内部竞争。如果三个同学的上限和下限一致,那么他们陷入内卷竞争,每个人为了不落后,这样他们为了保住排名就的增加字数。如果上限不一致,甲同学只需要做到乙同学的上限加一就可以保住自己的排名。在整体而言看来,乙同学竞争不赢甲同学,他也没必要做到上限,这样来保证整体的字数最少。
代码
#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;
else
return 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;
}