• [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++

  • 相关阅读:
    化DataSet对象并压缩
    数据库连接
    触发器
    事务
    关于C语言的宏
    GCC中的一些参数
    《tkinter实用教程六》tkinter ttk.Label 控件
    《tkinter实用教程三》ttk.Button 控件
    5. 替换空格
    《tkinter实用教程二》ttk 子模块
  • 原文地址:https://www.cnblogs.com/wzc521/p/11616056.html
Copyright © 2020-2023  润新知