凑木棒
我从我自己QQ空间转来的算原创吧
题目描述
老师有N根长度相同的木棒,长度是一个整数。他把每一根木棒都锯成两半,其中一半给小明,另一半给小红,每一半的长度恰好都是整数。
老师让小明和小红测量出各自手中的N根半截木棒的长度后,提出3个问题:
(1) 原来每根木棒的长度是多少?
(2) 每人都拿出一根半截木棒,能凑成一根木棒的最长长度是多少
(3) 最多能凑成几根最长长度的木棒
注意:凑成的每根木棒必须由小明和小红各拿出一根半截木棒。
输入
第1行: 1个整数N,表示木棒的数量
第2行:N个整数,表示小明的N根半截木棒的长度
第3行:N个整数,表示小红的N根半截木棒的长度
输出
第1行:1个整数L,表示锯之前每根木棒的长度
第2行:1个整数S,表示能凑成一根木棒的最长长度
第3行:1个整数C,表示最多能凑成多少根最长长度的木棒
样例输入
6
2 6 7 1 3 5
5 4 7 8 9 3
样例输出
10
16
1
解题
其实这题目描述有点问题,应该是两段,而不是两半。
第一问也是简单得不能再简单了,加起来除以段数即可。
第二问和第三问直接暴搜即可。
下面是代码
#include<cstdio>
int main()
{
int a,x,y=0,z=0,m,max1=-1,max2=-1;
scanf("%d",&a);
int b[a],c[a];
for(x=0;x<a;x++)
{
scanf("%d",&b[x]);
y+=b[x];
if(b[x]>max1)
max1=b[x];
}
for(x=0;x<a;x++)
{
scanf("%d",&c[x]);
y+=c[x];
if(c[x]>max2)
max2=c[x];
}
for(x=0;x<a;x++)
for(m=0;m<a;m++)
if(b[x]+c[m]==max1+max2)
z++;
printf("%d\n%d\n%d\n",y/a,max1+max2,z);
}
但是我可没告诉你这是正确代码。
这个代码交上去只会听取WA声一片,那么是哪里错了呢?
其实,这样一个循环,会导致同一段木块重复使用
例如:
小明: 3 3
小红: 5 1 第三问正解应为1 但那个程序会输出2
下面是ac代码
#include<cstdio>
int main()
{
int a,x,y=0,z=0,m=0,max1=-1,max2=-1;
scanf("%d",&a);
int b[a],c[a];
for(x=0;x<a;x++)
{
scanf("%d",&b[x]);
y+=b[x];
if(b[x]>max1)
max1=b[x];
}
for(x=0;x<a;x++)
{
scanf("%d",&c[x]);
y+=c[x];
if(c[x]>max2)
max2=c[x];
}
for(x=0;x<a;x++)
if(b[x]==max1) z++;
for(x=0;x<a;x++)
if(c[x]==max2) m++;
if(z>m) z=m;
printf("%d\n%d\n%d\n",y/a,max1+max2,z);
}
由于这个程序是初学时写的,若有错误或观赏性不佳,请多包涵。