贪心算法(2)

介绍见我的文章:贪心算法(1)-CSDN博客


【P10844】 勇者斗恶龙
提交0.75K
通过0.42K
时间限制1000MS  
内存限制64MB
题目描述

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

输入格式

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

输出格式

对于每组数据,输出最少花费。如果无解,输出“Loowater is doomed!”。

输入样例#1
2 3 





2 1 


10 
0 0 
输出样例#1
11 
Loowater is doomed! 
#include<bits/stdc++.h>
using namespace std;
int n,m,a[20010],b[20010],ans;
int main() {
	while(cin>>n>>m) {
		if(n==0&&m==0)break;
		ans=0;
		for(int i=1; i<=n; i++) 
			cin>>a[i];
		for(int i=1; i<=m; i++) 
			cin>>b[i];
		sort(a+1,a+1+n);
		sort(b+1,b+1+m);
		int j=1;
		for(int i=1; i<=m; i++) {
			if(b[i]>=a[j]) {
				ans+=b[i];
				j++;
				if(j>n)break;
			}
		}
		if(j>n)cout<<ans<<endl;
		else cout<<"Loowater is doomed!"<<endl;
	}
	return 0;
}

【P10845】 突击战
提交0.41K
通过0.19K
时间限制1000MS
内存限制500MB
题目描述

你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交代任务,但部下们可以同时执行他们各自的任务。

输入格式

输入包含多组数据,每组数据的第一行为部下的个数n(1<=n<=1000);以下n行,每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交待任务的时间和执行任务的时间。输入结束标志为n=0。

输出格式

对于每组数据,输出所有任务完成的最短时间。具体输出格式见样例,用Case开头,Case以后输出当前数据的序号,然后输出答案。

输入样例#1

2 5 
3 2 
2 1 

3 3 
4 4 
5 5 
输出样例#1
Case 1: 8 
Case 2: 15 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+7;
int N;
struct node {
	int a,b;
} Node[maxn];
bool cmp(node a,node b) {
	if(a.b!=b.b) return a.b>b.b;
	else          return a.a>b.a;
}
int main() {
	int cnt=0;
	while(~scanf("%d",&N)) {
		if(N==0) break;
		int i,j;
		for(i=0; i<N; ++i) {
			scanf("%d%d",&Node[i].a,&Node[i].b);
		}
		sort(Node,Node+N,cmp);
		ll previd1=Node[0].a;
		ll mx=previd1+Node[0].b;
		for(i=1; i<N; ++i) {
			previd1+=Node[i].a;
			mx=max(mx,previd1+Node[i].b);
		}
		printf("Case %d: %lld\n",++cnt,mx);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值