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;
}