内卷

内卷

题目描述

期末有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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所恋皆洛尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值