内卷
题目描述
期末有n个同学写论文,第i个人写论文的字数在 [ Li , Ri ] 之间,定义wi为某个同学写的字数。
所以Li≤wi≤Ri
而成绩的得分是非常有趣的,第i个同学gi的论文得分为n-Ki
Ki是比当前这个人的论文字数多的人数
每个人都想写尽可能多的字,因为每位同学都想尽可能得到更高的得分。
所以很容易想到让wi=Ri即可。
但是zks发现了有一个有趣的现象
假设对于每位同学来说,∀i∈[1,n] Li=1000,Ri=10000. 那么在最积极情况下,每位同学都写10000字,即wi=10000.
所以每位同学的得分都为n-0(ki=0,因为没有被任何同学超过)。但是如果每位同学都写1000字,每个人的得分仍然为n-0.
这种现象被称之为内卷
感受到内卷的威力了嘛?!
现在让你尽可能降低1~n位同学所有字数总和的情况下,即min{w1+w2+…+wn} 的同时保证每位同学不能低于在尽自己最大努力时所能得到的分数
你能帮帮zks解决这个问题吗?
输入
第一行有一个正整数n
接下来有n行,第i行有两个正整数Li,Ri
1≤n≤1e5
1≤Li≤Ri≤1e9
输出
输出最小的 w1+w2+…+wn的值
样例输入 Copy
3
1 10000
1 10000
1 10000
样例输出 Copy
3
提示
样例2:
输入
4
1 2
2 2
2 4
3 4
输出
10
分析题意,大概就是保证每位同学不能低于在尽自己最大努力时所能得到的分数,同时还要满足论文字数的总和最小
字数的上限是决定字数总和大小的关键因素
所以用这个作为突破点
把输入的字数范围按上限的大小进行排序,从小到大排序;
如果上限都一样,就按下限进行排序,从大到小;
排完序之后进行处理,从排完序后的第一个下限开始累加,
如果后面的下限比前面的小就按前面的字数加,如果后面的字数大,
就按后面的下限加,以此内推。
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
struct node
{
long long int li, ri;
}arr[M];
bool cmp(node a, node b)
{
if (a.ri == b.ri)
{
return a.li > b.li;
}
else return a.ri < b.ri;
}
int main()
{
long long int n, i, j,sum = 0;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> arr[i].li >> arr[i].ri;
}
sort(arr, arr + n + 1, cmp);
int min = 0;
for (i = 1; i <= n; i++)
{
if (arr[i].li <= min)
{
sum += min;
}
else
{
min = arr[i].li;
sum += min;
}
}
cout << sum << endl;
}