sdacm-test013-20170502

问题 A: 回形取数

时间限制: 1 Sec  内存限制: 128 MB
提交: 14  解决: 14
[提交][状态][讨论版]

题目描述

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

输入格式

输入

输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。

输出格式

输出

输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

样例输入

3 3

1 2 3

4 5 6

7 8 9

样例输出

1 4 7 8 9 6 3 2 5

提示

[提交][状态]

 

题目大意

给出一个n*n的方阵,逆时针输出方阵中的数据。

解题思路

定义一个变量用1,2,3,4分别存取输出的方向,然后一圈一圈的输出。

错误分析

方向找错。

#include<stdio.h>
int main()
{
int a,b,c,d,i,j,k,v,f;
int z[220][220];
while(scanf("%d%d",&a,&b)!=EOF)
{
for(i=1;i<=a;i++)
{
for(j=1;j<=b;j++)
{
scanf("%d",&z[i][j]);
}
}

c=1;
d=1;
v=a*b;
k=1;
f=0;
while(v>0)
{
if(k==1)
{
j=d;
for(i=c;i<=a;i++)
{
if(f==0)
{
printf("%d",z[i][j]);
f=1;
}
else
printf(" %d",z[i][j]);
v--;
if(v==0)
break;
}
k=2;
d++;
}
else if(k==2)
{
i=a;
for(j=d;j<=b;j++)
{
printf(" %d",z[i][j]);
v--;
if(v==0)
break;
}
a--;
k=3;
}
else if(k==3)
{
j=b;
for(i=a;i>=c;i--)
{
printf(" %d",z[i][j]);
v--;
if(v==0)
break;
}

b--;
k=4;

}
else if(k==4)
{
i=c;
for(j=b;j>=d;j--)
{
printf(" %d",z[i][j]);
v--;
if(v==0)
break;
}

c++;
k=1;

if(v==0)
break;
}
printf("\n");
}
return 0;
}

问题 B: 丑数

时间限制: 1 Sec  内存限制: 32 MB
提交: 17  解决: 5
[提交][状态][讨论版]

题目描述

如果一个数的素因子只包含2,3,5或7,那么我们把这种数叫做丑数。序列1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27...展示了前20个丑数。
请你编程寻找这个序列中的第n个元素。

输入

输入包含多组测试数据。每组输入为一个整数n(1<=n<=5842),当n=0时,输入结束。

输出

对于每组输入,输出一行“The nth humble number is number.”。里面的n由输入中的n值替换,“st”,“nd”,“rd”和“th”这些序数结尾的用法参照输出样例。

样例输入

1

2

3

4

11

12

13

21

22

23

100

1000

5842

0

样例输出

The 1st humble number is 1.

The 2nd humble number is 2.

The 3rd humble number is 3.

The 4th humble number is 4.

The 11th humble number is 12.

The 12th humble number is 14.

The 13th humble number is 15.

The 21st humble number is 28.

The 22nd humble number is 30.

The 23rd humble number is 32.

The 100th humble number is 450.

The 1000th humble number is 385875.

The 5842nd humble number is 2000000000.

提示

[提交][状态]

 

题目大意

给出一个n输出第n个因子只有2,3,5,7的数

解题思路

打表,把2000000000以内的所有符合数存入数组,然后输出第n项。

错误分析

打表打错,还有输出时的st,nd,rd,th,的问题

代码见文件,数据太大不好复制

 

问题 C: 赌徒

时间限制: 1 Sec  内存限制: 32 MB
提交: 35  解决: 14
[提交][状态][讨论版]

题目描述

有n个赌徒打算赌一局。规则是:
每人下一个赌注,赌注为非负整数,且任意两个赌注都不相同。胜者为赌注恰好是其余任意三个人的赌注之和的那个人。如果有多个胜者,我们取赌注最大的那个为最终胜者。
例如,A,B,C,D,E分别下赌注为2、3、5、7、12,最终胜者是E,因为12=2+3+7。

输入

输入包含多组测试数据。每组首先输入一个整数n(1<=n<=1000),表示赌徒的个数。
接下来n行每行输入一个非负整数b(0<=b<32768),表示每个赌徒下的赌注。
当n=0时,输入结束。

输出

对于每组输入,输出最终胜者的赌注,如果没有胜者,则输出no solution。

样例输入

5

2

3

5

7

12

5

2

16

64

256

1024

0

样例输出

12

no solution

提示

[提交][状态]

 

题目大意

如果一个数等于另外3个数的和,他就是胜者,输出数值最大的胜者。

解题思路

排序,从大到小开始找,四层循环,暴力求解。

错误分析

注意循环限制条件,注意优化,防止超时。

 

#include<stdio.h>
int main()
{
int a[1050];
int i,j,k,l,n,t,z;
while(scanf("%d",&n),n!=0)
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
z=0;
for(i=n;i>=1;i--)
{
if(a[i-1]+a[i-2]+a[i-3]<a[i])
continue;
for(j=i-1;j>=1;j--)
{

for(k=j-1;k>=1;k--)
{
for(l=k-1;l>=1;l--)
{
if(a[j]+a[k]+a[l]==a[i])
{
printf("%d\n",a[i]);
z=1;
break;
}
}
if(z==1)
break;
}
if(z==1)
break;
}
if(z==1)
break;
}
if(z==0)
printf("no solution\n");
}
return 0;
}

问题 F: 在披萨店里的思考

时间限制: 1 Sec  内存限制: 32 MB
提交: 28  解决: 20
[提交][状态][讨论版]

题目描述

今天小明来到一家披萨店吃披萨,由于实在太饿了,他决定点一个超大的披萨。不过这家店很奇怪,制作的披萨都是矩形的。于是爱思考的小明想知道这个披萨能否完全放置于自己所在的圆桌之内,也就是披萨是否一定会有部分悬空于桌边之外。请你编程帮他解决。

输入

输入包含多组测试数据。每组输入数据一开始为一个整数r(1<=r<=1000),表示圆桌面的半径,当r=0时,输入结束。
随后输入两个整数w和l,分别表示披萨的宽和长。(1<=w<=l<=1000)

输出

对于每组输入,输出披萨是否可以完全放在圆桌内。具体输出格式见所给的输出样例。
如果一个披萨刚刚与桌边相碰,那么属于可以完全放在圆桌内的。

样例输入

38 40 60

35 20 70

50 60 80

0

样例输出

Pizza 1 fits on the table.

Pizza 2 does not fit on the table.

Pizza 3 fits on the table.

提示

[提交][状态]

 

题目大意

给出圆桌半径,给出披萨的长和宽,判断披萨能否完全放于圆桌上,输入以0,结尾。

解题思路

求出披萨对角线长度,再求出圆桌半径,比较大小,做出判断。

错误分析

输出错误,题意理解错误。

 

#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,k;
double d;
k=0;
while(scanf("%d%d%d",&a,&b,&c),a!=0)
{
k++;
d=sqrt(b*b+c*c);
if(d>a*2)
printf("Pizza %d does not fit on the table.\n",k);
else
printf("Pizza %d fits on the table.\n",k);


return 0;
}

问题 I: 木棒

时间限制: 1 Sec  内存限制: 32 MB
提交: 36  解决: 17
[提交][状态][讨论版]

题目描述

现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模板的。木工机需要的准备时间如下:
(1)第一根木棒需要1min的准备时间;
(2)在加工了一根长为l,重为w的木棒之后,接着加工一根长为ll(l<=ll),重为ww(w<=ww)的木棒是不需要任何准备时间的。否则需要一分钟的准备时间。
给定n根木棒,你要找到最少的准备时间。例如现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备时间最少为2min,顺序为(1,4),(3,5),(4,9),(2,1),(5,2)。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示测试数据的个数。
每个测试例两行:
第一行是一个整数n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2个整数,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,这些数均不大于10000,其中li和wi表示第i根木棒的长度和重量。

输出

输出以分钟为单位的最少准备时间。

样例输入

3

5

4 9 5 2 2 1 3 5 1 4

3

2 2 1 1 2 2

3

1 3 2 2 3 1

样例输出

2

1

3

提示

[提交][状态]

 

题目大意

给出木棒长度重量,如果木板长度重量都大于另一个,就不加一否则加一。

解题思路

排序,求出连续子串数。

错误分析

         代码错误,不完善。

 

#include<stdio.h>
#include<string.h>
int main()
{
int t,v,i,j,k,n;
int a[5050][5];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i][0],&a[i][1]);
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i][0]>a[j][0])
{


k=a[i][0];
a[i][0]=a[j][0];
a[j][0]=k;
k=a[i][1];
a[i][1]=a[j][1];
a[j][1]=k;

}
if(a[i][0]==a[j][0])
{
if(a[i][1]>a[j][1])
{
k=a[i][0];
a[i][0]=a[j][0];
a[j][0]=k;
k=a[i][1];
a[i][1]=a[j][1];
a[j][1]=k;
}
}

}
}
v=0;
for(i=1;i<=n;i++)

if(i==n)
{
if(a[i][0]>0)
v++;
}
else
if(a[i][0]>0)
{
for(j=i+1;j<=n;j++)
{
if(a[i][0]<=a[j][0]&&a[i][1]<=a[j][1])
{
a[i][0]=a[j][0];
a[i][1]=a[j][1];
a[j][0]=-1;
}
}a[i][0]=-1;
v++;
}
}
printf("%d\n",v);
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值