问题 C: 排队出发——结构体排序

时间限制: 1 Sec 内存限制: 128 MB

题目描述
神牛岛是传说中的一个岛屿,凡是成功到那里游历,完成探险并返回的人,都会成为神牛。但是,现实中却没有人知道如何到达神牛岛。
这天夜里,笃志者睡着之后,不久就进入了梦乡。他突然看到有人在问,“有人想去神牛岛的吗?”神牛岛之旅的牌子前,就开始有不少勇士报名要去冒险探索。
“我们会把勇士安排在前,带领大家一起去神牛岛。下面开始点名!”管理队伍的 LXY 神牛说。其实说实话,给学生排队这种工作是最让神牛头疼的了。因为同学们都有自尊心,都不愿意排后面。共有 n 个同学要排成一列,每个同学有两个属性:影响力和承受能力。给一个同学造成的心理创伤指数等于所有在他前面同学的影响力之和减去他的承受能力。现在请你帮忙安排一下点名顺序,尽量使受到心理创伤最大的同学少受创伤。
输入
输入包含n+1行:
第1行是整数n,表示同学的个数。
第2~n+1行每行两个自然数,分别是该同学的影响力和承受能力。
输出
输出包含1行,为你安排的顺序中受到心理创伤最大的同学受到的创伤。
样例输入
3
10 3
2 5
3 3
样例输出
2
提示
对于100%的数据,1<=n<=50000,1<=影响力<=10000,1<=承受能力<=1,000,000,000。
这道题值的考虑的是排序部分。说一下代码中结构体的变量意义,a表示影响力,b表示承受力,t表示创伤。
排序原则:根据结构体的排序,即cmp函数,给你两组数9,3和10,1(随便取得哈qwq),正确的排序应该是
10,1
9,3
结果是7,我们得到的结果其实是有式子10-3=7<(9-1=8)得到的,所以就有了排序原则 x.a-y.b<y.a-x.b;如果给的两组数满足这个不等式,返回bool,否则,返回false。很明显,给的例子返回false,两个数要交换位置。
根据这个思路,就有了排序的函数。
(注意:排序的时候,不能知识按照影响力或承受力排序,要把两者结合起来看)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <vector>
#include <queue>
#define ll long long
#define inf 0x3f3f3f3f//无穷大
using namespace std;
struct node
{
    ll a,b,t;
}c[60000];
bool cmp(node x,node y)
{
        return x.a+x.b<y.a+y.b;
}
int main()
{
    ll n,i,j,sum=0,maxx=-inf;
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
         scanf("%lld%lld",&c[i].a,&c[i].b);
    }
    sort(c+1,c+n+1,cmp);
    for(i=1;i<=n;i++)
    {
         c[i].t=c[i-1].t+c[i-1].a;//前缀和的思想,记录前面影响力的和
    }
    for(i=1;i<=n;i++)
    {
        maxx=max(maxx,c[i].t-c[i].b);
    }
    printf("%lld",maxx);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值