SCAU计算智能二周目

题目描述

18118 勇者斗恶龙
Description
有n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙
一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只
能砍一个头(且不能被雇佣两次)

输入格式
多组数据,每组数据的第一行为正整数n和m(1<=n,m<=200000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为
一个整数,即每个骑士的能力。输入结束标志n=m=0;

输出格式
输出格式:每组数据,输出最少花费,无解输出"Loowater is doomed!"

输入样例
2 3
5
4
7
8
4
2 1
5
5
10
0 0

输出样例
11
Loowater is doomed!

简单说下这题

这题的做法是暴力+贪心。
这道题目的话,如果用的是C++写,如果你用的是流输入和输出,一定会超时,因为这道题目的数据输入量太过庞大,所以我们改用scanf。
那么这道题目怎么做呢?首先因为要使得使用的金币最少,所以我们对士兵和龙排个顺序,从小到大。然后一个循环代表士兵,一个一个找符合小于士兵能力值的龙(每次都选第一个满足符合条件的士兵),然后用money来记录花费的金币,然后继续找符合下一条龙的。
这题的思想就是贪心,如何使得自身的利益最大化。
代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
int n,m;
int dragon[200005],soldier[200005];
int main()
{
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
        ll money=0;
        for(int i=1; i<=n; i++)
            scanf("%d",&dragon[i]);
        for(int i=1; i<=m; i++)
            scanf("%d",&soldier[i]);
        if(n>m)
        {
            printf("Loowater is doomed!\n");
            continue;
        }
        sort(dragon+1,dragon+1+n);
        sort(soldier+1,soldier+1+m);
        int k=1;
        for(int i=1; i<=m; i++)
        {
            if(n==k-1)
                break;
            if(soldier[i]>=dragon[k])
            {
                money+=soldier[i];
                k++;
            }
        }
        if(k-1==n)
            printf("%lld\n",money);
        else
            printf("Loowater is doomed!\n");
    }
    return 0;
}

18107 校赛排名

Description
校赛结束了,每一个参赛选手由3个数据项构成(通过题数,用时分钟数,姓名),排名按照通过题数排序
通过题数多的排前,同题数的,罚时少的排前。如果题数相同,罚时也相同,而按数据读取的先后排。
给你N个参赛选手的数据,按排序先后,输出姓名

输入格式
第一个数为N,(N<=500000)
此后,每行一个参赛选手的数据,通过题数,用时分钟数,姓名,前两者为整型数,姓名为字符串(不多于20个字符)

输出格式
姓名排名

输入样例
4
3 5 Jon
5 100 Smith
3 5 Tom
6 95 Hel

输出样例
Hel
Smith
Jon
Tom

提示
由于有500000个数据,输入和输出务必使用scanf和printf

说下这道题目

我想说,老哥,这题是真的nb,这个考到了sort的不稳定性,如果用sort是过不了这题的,所以我们改用stable_sort。
那么这道题目怎么写呢?我们定义一个结构体,里面存有AC题数,AC时间和名字。
我们只需要将这个结构体数组按规定的规则排序就行了,按AC优先、时间其次(少的强)、原本的次序。按这个顺序排序就可以得到答案了。
代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
typedef struct
{
    ll AC;
    ll time;
    char name[30];
} NODE;
bool cmp(NODE x,NODE y)
{
    if(x.AC!=y.AC)
        return x.AC>y.AC;
    else if(x.time!=y.time)
        return x.time<y.time;
        return 0;
}
NODE str[500005];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%lld %lld %s",&str[i].AC,&str[i].time,str[i].name);
    stable_sort(str+1,str+n+1,cmp);
    for(int i=1; i<=n; i++)
        printf("%s\n",str[i].name);
    return 0;
}
发布了43 篇原创文章 · 获赞 26 · 访问量 3068

猜你喜欢

转载自blog.csdn.net/Leo_zehualuo/article/details/104804830