题目描述
$X$国和$Y$国开战了!
作为$X$国的军事参谋,你了解到事态的严峻性。为了更好地应付敌人,你收集到了$Y$国城市中$n$个据点的信息,你打算攻破这$n$个据点!
每个据点$i$的信息由火力系数$A[i]$、士兵数目$B[i]$组成,作为一名具有高超预谋能力的参谋,你当然可以借此分析情势。实际上,你分析得出,攻占一个据点 i,为了稳定己方士兵士气,至少需要$B[i]$个士兵参战,战后将会有$A[i]$个士兵阵亡。
由于不停地调谴,可用的士兵已经不多了,于是在一个据点参战且未阵亡的士兵可能会参加别的据点的战斗。你需要计算出攻破这$n$个据点所需要的最少的士兵数目。
然而更糟的,一共有$T$个城市,所以你需要将$T$个城市所需的最少士兵数目依次输出。
输入格式
第一行为一个整数$T$,表示城市数目。
接下来$T$组数据。每组数据第一行包含一个数$n$,表示据点数目;接下来$n$行,其中第$i$行包含两个数,分别表示这个据点的火力系数$A[i]$以及士兵数目$B[i]$。
输出格式
对于每个城市输出一行,表示攻占这个城市所有据点所需要的最少士兵数目。
样例
样例输入:
2
2
4 7
1 5
3
1 4
4 6
3 5
样例输出:
8
10
数据范围与提示
对于前$20\%$的数据$nleqslant 9$
对于前$40\%$的数据$nleqslant 1,000$
对于$100\%$的数据$nleqslant 100,000,Tleqslant 10,1leqslant A[i]leqslant B[i]leqslant 1,000,000,000$。
由于本题读入数据较多,建议使用较快的读入方式。
题解
显然我们将损失大的排在后面会更优,那么你就$A$了,真的没啥好说的
时间复杂度:$Theta(T imes nlog n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int a,b,delta;}e[100001];
int n;
long long ans,now;
bool cmp(rec a,rec b){return a.delta>b.delta;}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=now=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].a,&e[i].b);
e[i].delta=e[i].b-e[i].a;
}
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(now<e[i].b)
{
ans+=e[i].b-now;
now=e[i].b;
}
now-=e[i].a;
}
printf("%lld
",ans);
}
return 0;
}
rp++