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);
}
}
} 展开
最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数 杀死恶龙,于是找到你寻求帮助。
输入:
第一行 龙头数 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);
}
}
} 展开
1个回答
展开全部
#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;
}
#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至少会使用两次。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询