[CSP-S模拟测试]:X国的军队(贪心)

Posted wzc521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CSP-S模拟测试]:X国的军队(贪心)相关的知识,希望对你有一定的参考价值。

题目描述

  $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++

以上是关于[CSP-S模拟测试]:X国的军队(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

9.16考试 第一题 X国的军队题解

「题解」:X国的军队

[CSP-S模拟测试]:Graph(图论+贪心)

[CSP-S模拟测试]:爬(贪心)

[CSP-S模拟测试]:简单的填数(贪心+模拟)

[CSP-S模拟测试]:C(三分+贪心)