C语言 北理工的恶龙

背景:
最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数 杀死恶龙,于是找到你寻求帮助。
输入:
第一行 龙头数 n , 勇士人数 m ( 1<=n, m<=100 ) 接下来 n 行,每行包含一个整数,表示龙头的直径 接下来 m 行,每行包含一个整数,表示勇士的身高 l
 输出:
 如果勇士们能完成任务,输出校长需要花的最小费用;否则输 出 “bit is doomed! ” 我的问题是有一个隐藏用例过不去,求解答!
代码:
#include<stdio.h>
int main()
{
int n,m,i,j,t1,t2,l=0,s=0;
int w[100],d[100],k[100];
scanf("%d%d",&n,&m);
if(n>m) printf("bit is doomed!\n"); //d数组对应n,t1,w数组对应m,t2
else{
for(i=0;i<n;i++)
{
scanf("%d",&d[i]);
}
for(j=0;j<m;j++)
{
scanf("%d",&w[j]);
}
for(i=0;i<n-1;i++) //将d数组从小到大排序
{for(j=0;j<n-i-1;j++)
if(d[j]>d[j+1])
{t1=d[j];
d[j]=d[j+1];
d[j+1]=t1;
}
}
for(i=0;i<m-1;i++) //将w数组从小到大排序
{for(j=0;j<m-i-1;j++)
if(w[j]>w[j+1])
{t2=w[j];
w[j]=w[j+1];
w[j+1]=t2;
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(w[i]>=d[j])
{
k[i]=w[i];
l++;
break;
}
}
}
if(l<n) printf("bit is doomed!\n");
else
{
for(i=0;i<n;i++)
s+=k[i];
printf("%d\n",s);
}
}
}

#include<stdio.h>
#include<stdlib.h>

int main()
{
int sum=0,i,j,t,c,n,m,d[100],w[100];

scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&d[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&w[i]);
}
for(i=0;i<m-1;i++)
{
for(j=0;j<m-1-i;j++)
{
if(w[j]>w[j+1])
{
t=w[j];
w[j]=w[j+1];
w[j+1]=t;
}
}
}
c=n;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(w[j]>=d[i])
{
sum+=w[j];
for(t=j+1;t<m;t++)
{
w[t-1]=w[t];
}
m--;
c--;
break;
}
}
}
if(0==c)
{
printf("%d\n",sum);
}
else
{
printf("bit is doomed! \n");
}
return 0;
}追问

那可以帮我看一下我那个代码是什么情况下会出问题吗?

追答

if(w[i]>=d[j]) { k[i]=w[i]; l++; break; }这里有逻辑错误,一个元素w[i]使用完后,应有措施排除它,避免下次可能会重复使用。
比如假设有有序序列:
d 165,167...
w 168,170,172...
按你的处理,168至少会使用两次。

追问

十分感谢,能再指导下我那个该怎么改吗。。

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网