Uva 11292 and Uva 11729

Uva 11292

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19048

题目大意:有一条n个头的恶龙,还有m个骑士,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需花费x个金币。一个骑士只能用一次。


分析:非常简单的贪心啦。把骑士按能力值从小到大排序,再把龙头按照直径从小到大排序,然后一个一个砍就可以啦。

下面附上代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mmm=20005;

int d[mmm],k[mmm];

int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)==2&&n&&m)
	{
		for(int i=0;i<n;i++)scanf("%d",&d[i]);
		for(int i=0;i<m;i++)scanf("%d",&k[i]);
		if(n>m)printf("Loowater is doomed!\n");
		else
		{
		  sort(d,d+n);
		  sort(k,k+m);
		  int s=0;
		  int c=0;
		  for(int i=0;i<m;i++)
		  if(k[i]>=d[c])
		  {
			s+=k[i];
			if(++c==n)break;
		  }
		 if(c<n)printf("Loowater is doomed!\n");
		 else printf("%d\n",s);
		}
	}
	return 0;
}


Uva 11729

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28436

题目大意:你有n个部下,第i个部下需要你交代b[i]分钟,然后立即花j[i]分钟完成任务,你需要一个个地交代,要求完成所有任务的最短时间。


分析:直觉可以告诉你,执行时间较长的任务应该先交代。所以可以用一个贪心算法;按照j值从大到小给各个任务排序,然后依次交代。

那么又如何证明呢?

现在假设有两个相邻的任务X和Y(交换前X在Y前面,即b[x]>b[y]),显然,其他任务完成的时间都没有影响,那么我们就来看看这两个任务。

可以分成X先完成和Y先完成两种情况,然后画图判断即可证明。


下面是代码:

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=1010;
int b[maxn],j[maxn];

int main()
{
  int n,kase=1;
  while(scanf("%d",&n)&&n)
  {
  	for(int i=1;i<=n;i++)
  	  scanf("%d%d",&b[i],&j[i]);
  	int t;
  	for(int i=1;i<=n;i++)
  	  for(int k=1;k<=n-i;k++)
  	    if(j[k]<j[k+1])
  	    {
  	      t=b[k];
  	      b[k]=b[k+1];
  	      b[k+1]=t;
  	      t=j[k];
  	      j[k]=j[k+1];
  	      j[k+1]=t;
		}
	int ans=0,x=0;
	for(int i=1;i<=n;i++)
	{
	  x+=b[i];
	  ans=max(ans,x+j[i]);
	}
	printf("Case %d: %d\n",kase++,ans);
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值