题目描述
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;
}