当前位置:首页 >> 其它课程 >> 算法标准答案

算法标准答案


Problem H: 乘法口诀
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 11234 Solved: 3034

Description
还记得以前小学时的九九乘法口诀吧。现在要求你编写程序打印出乘法口诀。 不过 现在的乘法口诀表跟以前稍微有点区别,我告诉你一个数字 n( 1 <= n

<= 9), 你要给我打出相应的 nn 乘法口诀表。

Input
多个测试数据。每个测试数据一行,输入整数 n.

Output
输出 nn 乘法口诀表。 每个乘法口诀表中的任何一个乘式占 6 列,不足 6 列的在后 面补空格。同一行 2 个乘式之间有一个空格。 两个乘法口诀表之间有一个空行。注 意乘法口诀中每一行最后没有空格,如 4*4=16 和 5*5=25 后面都没有空格的。

Sample Input
1 2 6

Sample Output
1*1=1

1*1=1 1*2=2 2*2=4

1*1=1 1*2=2 1*3=3 2*2=4 2*3=6 3*3=9

1*4=4 1*5=5 1*6=6

2*4=8

3*4=12 4*4=16

2*5=10 3*5=15 4*5=20 5*5=25 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

HINT
%-2d 表示对齐方式为左对齐 例如,printf("%-6d",100);将输出:
#include<stdio.h> #include<string.h> int main() { int n,i,j; char a[10][10]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=i-1;j++) { a[i][j]=j*i; printf("%d*%d=%-2d ",j,i,a[i][j]); } printf("%d*%d=%-2d",i,i,i*i); printf("\n"); } printf("\n"); } return 0; }

100

Problem G: 打印金字塔
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 6241 Solved: 3777

Description
请编写程序输出金字塔图形。

Input
多个测试数据。每个测试数据输入一个整数 n(1 <= n <= 9)

Output
输出 n 层金字塔。

Sample Input
1 3

Sample Output
* * *** *****

HINT
用双重循环做,外循环代表行数,第一个内循环输出空格,第二个内循环输出* for(;;) { for(;;) { }//输出空格 for(;;) { }//输出*

}//外循环
#include<stdio.h> int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(k=1;k<2*i;k++) printf("*"); printf("\n") ; } } return 0; }

3920: 老外买瓷砖
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1344 Solved: 656

Description
大酬宾活动的第三天,店里突然来了一个老外。还是高中生的小娥在开店。可怜的 小娥被老外流畅的外语给吓蒙了。老外没办法,只好一个字母一个字母地把订单念 给小娥。吓蒙的小娥只记得有几个元音字母了(aeiou),不过很不幸的是她把 H 也 当作了 A,Y 当作了 I.

Input
第一行输入一个整数 n,表示老外说了多少句话。 然后是 n 行, 每一行是老外说的外 语。

Output
对于老外说的每句话,请统计出小娥记得的各元音字母的个数(包含记错的),每个 元音 1 行,格式见例子

Sample Input
2 Hello. How are you!

Sample Output
a:1 e:1 i:0 o:1 u:0 a:2 e:1 i:1 o:2 u:1

HINT
一句话不超过 50 个字符
#include <stdio.h> void f(int* a,char* s) { { switch(*s) { case 'h': case 'H': case 'A': case 'a':a[0]++; break; case 'E': case 'e': a[1]++;break; case 'Y': while(*s)

case 'y': case 'I': case 'i': a[2]++; break; case 'O': case 'o': a[3]++; break; case 'U': case 'u': a[4]++;break; } s++; }} int main() { char s[200]; int a[5]; int n,i,j; scanf("%d",&n); getchar(); for(i=0;i<n;i++) { for(j=0;j<5;j++) a[j]=0; gets(s); f(a,s); printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",a[0],a[1],a[2],a[3],a[4]); } return 0;}

Problem A: 双层金字塔
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4962 Solved: 3290

Description
输出双层金字塔。

Input

多个测试数据。每个测试数据输入一个整数 n( 2 <= n <= 9)

Output
输出双层金字塔。

Sample Input
2 5

Sample Output
* *** * * *** ***** ******* ********* ******* ***** *** *
#include<stdio.h> int main() {int n,i,j,a,b; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(j=1;j<=2*i-1;j++) printf("*");

printf("\n"); } for(a=1;a<n;a++) { for(b=1;b<=a;b++) printf(" "); for(b=1;b<=2*(n-a)-1;b++) printf("*"); printf("\n"); }} return 0; }

3919: 堆瓷砖
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1819 Solved: 750

Description
上次来定制的客户买走了不少瓷砖,确实给公司带来了不少利润,可是望着裁剪下 来的瓷砖,陈盖历发愁了。这些尺寸不一的瓷砖堆的满地都是。哎,还是想个办法 把他们堆成堆吧。当然堆的时候最大的要放在下面,绝对不允许大的瓷砖放在小的 上面,否则变形了下次就不好卖了。你能帮忙把这些瓷砖堆起来吗?

Input
第一行输入一个整数 n,表示共要堆成的堆数。然后是 n 行,每行先输入 1 个整数 m,表示这一堆有 m 块瓷砖,然后紧跟着输入 m 个整数,表示瓷砖的尺寸

Output
对于每一堆输出一行,分别是该堆的瓷砖尺寸,按照从大到小进行排列,2 个数之 间有一个空格

Sample Input
2 4 3 4 5 6

3 8 4 9

Sample Output
6 5 4 3 9 8 4

HINT
n m 不会超过 50
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

#include <stdio.h> int main() { int n,i,j,l,a[50],index,t,k; scanf("%d",&n); for(k=0;k<n;k++) { scanf("%d",&l); for(j=0;j<l;j++) scanf("%d",&a[j]); for(j=0;j<l;j++) { index=j; for(i=j+1;i<l;i++) if(a[index]<a[i]) index=i; {t=a[index]; a[index]=a[j]; a[j]=t; } } for(j=0;j<l-1;j++) printf("%d ",a[j]); printf("%d\n",a[l-1]); } return 0; }

32 33 34

3918: 定制瓷砖
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1746 Solved: 1092

Description
新年大酬宾活动一开展,吸引了好多客户。这天来了一个客户,他有一个特别的要 求。他需要定制不同尺寸的瓷砖,用来装修在杭州、临安等地买的 10 几套房子。 他的要求是这样的,他报出房间的长与宽(当然都是整数),然后你按照他的要求 给他一个瓷砖的尺寸(正方形的,也是整数),以该尺寸的瓷砖能正好铺满他要求 的房间。当然他希望瓷砖的数量越少越好。ACM 出身的陈盖历嘿嘿一笑,不就是求 最大公约数吗?当然程序还是要你来写的。

Input
第一行输入一个整数 n,表示客户的房间数。然后是 n 行,每行输入 2 个整数,分 别表示房间的长与宽

Output
对于每组数据,输出一个整数,表示瓷砖的边长

Sample Input
2 6 12 6 8

Sample Output
6 2
#include<stdio.h>

int main() { int n,i,a,b,t,j,m; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); if(a>b) {t=a;a=b;b=t;} for(j=a;j>=2;j--) { if(a%j==0&&b%j==0) break; m=j; } printf("%d\n",j); } return 0; }

4135: 新年挂灯笼
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1025 Solved: 525

Description
又是新的一年,家家户户挂灯笼。请你编写一个程序,能根据需要打印出灯笼的图 案。

Input
多组测试数据,先输入一个整数 t,表示组数,然后输入然后输入 t 行,每行输入 1 个整数 n(n 不会大于 9),代表灯笼上半部分的层数

Output
对于每组测试数据输出对应的灯笼图案

Sample Input
3 1

2 3

Sample Output
* ** **** ** *** ***** ******* ***** ***
#include <stdio.h> int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x; int j; scanf("%d",&x); for(j=1;j<=x;j++) { for(int k=1;k<=x-j;k++) printf(" "); for(int k=0;k<(x+2*(j-1));k++) printf("*"); printf("\n"); } for(int j=x;j>1;j--) { for(int k=1;k<x-j+2;k++) printf(" "); for(int k=0;k<(x+2*(j-2));k++) printf("*");

printf("\n"); } } return 0; }

4137: 压岁钱
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1186 Solved: 721

Description
过年了,有些同学还能收到压岁钱。真羡慕。你能帮他算下,他收到了多少压岁钱 吗?

Input
多组测试数据,先输入一个整数 T,表示组数,然后输入然后输入 t 行,每行先输 入 1 个整数 n 表示他收到压岁钱的次数,后面紧跟着 n 个整数,表示他每次收到的 钱数

Output
对于每组测试数据,请输出他收到压岁钱总数

Sample Input
2 3 100 200 300 4 100 400 50 600

Sample Output
600 1150
#include <stdio.h> int main()

{ int n,m,i,t,j,s; scanf("%d",&t); for(i=1;i<=t;i++) { scanf("%d",&n); s=0; for(j=0;j<n;j++) { scanf("%d",&m); s=s+m; } printf("%d\n",s); } return 0; }

2413: 求三角形面积——C 语言初学者百 题大战之十四
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 7507 Solved: 4152

Description
输入三角形的三边长,求三角形面积。为简单起见,设输入的三边长 a,b,c 能构成 三角形。

Input
输入为一行,输入三角形的三条边长。

Output
输出为一行,计算出该三角形的面积,精确到小数点后 2 位

Sample Input
3 4 5

Sample Output
6.00

HINT
面积可以按下面的公式计算 s=sqrt(p(p-a)(p-b)(p-c))其中 p=(a+b+c)/2
#include<stdio.h> #include<math.h> int main() { float a,b,c,s,p; scanf("%f %f %f",&a,&b,&c); p=(a+b+c)*0.5; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf("%.2f\n",s); return 0; }

2412: 鹦鹉学舌 3——C 语言初学者百题大 战之十三
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 5169 Solved: 2593

Description
鹦鹉越来越会说话了,你可以说一句话(最多不要超过 80 个字符哦),鹦鹉也能 很快把你的话重复一遍。

Input
输入一行,中间可能有空格,回车表示说完了。

Output
输出也为一行,输出刚才输入的内容。

Sample Input
I am a student.

Sample Output
I am a student.
#include<stdio.h> #include<string.h> int main() { char a[81], * p=a; gets(a); puts(a); }

2411: 鹦鹉学舌 2——C 语言初学者百题大 战之十二
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4234 Solved: 3456

Description
还记得以前做过的那题鹦鹉学舌吗?恩,不错,那次要求输入一个整数,然后你要 输出该整数。现在要求从终端(键盘)输入一个字符,以回车键确认,然后你的程 序应该能输出该字符。

Input
输入一个字符,以回车确认

Output
输出你刚才输入的字符

Sample Input
e

Sample Output
e
#include<stdio.h> int main() { char c; c = getchar(); putchar(c); printf("\n"); return 0; }

3549: 更改大小写
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4089 Solved: 2942

Description
将输入一行字符串(小于 80 个字符),将其中的所有小写字母改为大写,其他字符 不变。

Input
输入一行字符串,以回车结束。

Output
将字符串中小写字母改大写后输出。

Sample Input
There are 3 pens.

Sample Output
THERE ARE 3 PENS.

HINT
#include<stdio.h> #include<string.h> int main() { char s[80]; int len,i; gets(s); len=strlen(s); for(i=0;i<len;i++) { if(s[i]>='a'&&s[i]<='z') s[i]=s[i]-32; } puts(s); return 0; } //输出修改后的字符串 //将小写字母转换为大写 //输入一段字符 //计算字符串长度

3545: 颠倒字符串
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4532 Solved: 2539

Description
输入一个以回车结束的字符串(少于 80 个字符),将字符串的内容颠倒过来再输出

Input
多组测试数据,每组输入一个以回车结束的字符串(少于 80 个字符)。

Output
将这个字符串颠倒过来输出

Sample Input
ABC XYZ My god

Sample Output
ZYX CBA dog yM
#include <stdio.h> int main() { char c[90]; int n,i,a; while((c[0]=getchar())!=EOF) { i=1; while((c[i]=getchar())!='\n') i++; for(n=i-1;n>=0;n--) printf("%c",c[n]); putchar('\n'); } return 0; }

Problem A: 零起点学算法 87——打印所 有低于平均分的分数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4813 Solved: 1344

Description
输入 n 个成绩,打印出所有低于平均分的分数(注意:ave = s/n 中 s 为 float 或 ave = (float)s/n)。

Input
多个测试数据每个测试数据一行,在这行中先输入分数的个数 n(1<=n<=100),然 后紧跟着输入 n 个整数(代表分数)

Output
对于每个测试数据,输出一行按照输入顺序输出所有低于(<)平均分的分数,中间 用一个空格隔开,如果没有低于平均分的那么只输出一个空行

Sample Input
3 40 50 60 2 90 80 5 10 10 90 80

Sample Output
40 80 10 10
#include <stdio.h> int main() { int a,p[100],flag=0; while(scanf("%d",&a)!=EOF) { int i,sum; double ave; sum=0; for(i=0;i<a;i++) { scanf("%d",&p[i]); sum=sum+p[i]; } ave=(float)sum/a; for(i=0;i<a;i++) { if(p[i]<ave) {

if(flag==0) { printf("%d",p[i]); flag=1; } else { printf(" %d",p[i]); } } } printf("\n"); flag=0; }}

2445: 平方和与立方和
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4252 Solved: 2145

Description
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。

Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数 m 和 n 组成。

Output
对于每组输入数据,输出一行,应包括两个整数 x 和 y,分别表示该段连续的整数 中所有偶数的平方和以及所有奇数的立方和。你可以认为 32 位整数足以保存结果。

Sample Input
3 1 2 5

Sample Output

4 28 20 152
#include<stdio.h> int main() { int a,b,t,i,s,c; while(scanf("%d%d",&a,&b)!=EOF) { s=0; c=0; if(a>b) { t=a; a=b; b=t;}

for(i=a;i<=b;i++) { if(i%2==0) if(i%2==1) } printf("%d %d\n",s,c); } return 0; } s=s+i*i; c=c+i*i*i;

2444: 求奇数的乘积
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4692 Solved: 3042

Description
给你 n 个整数,求他们中所有奇数的乘积。

Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为 n,表示本 组数据一共有 n 个, 接着是 n 个整数, 你可以假设每组数据必定至少存在一个奇数。

Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。

Sample Input
3 1 2 3 4 2 3 4 5

Sample Output
3 15
#include<stdio.h> int main() { int n,i,s,m; while(scanf("%d",&n)!=EOF) { s=1; for(i=1;i<=n;i++) { scanf("%d",&m); if(m%2==1) } printf("%d\n",s); } return 0; } s=s*m;

Problem A: 偶数排序
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1959 Solved: 987

Description

输入一个正整数 N 和 N 个整数, 将它们中的偶数按从大到小的顺序进行排序后输出。

Input
多组测试数据,每组输入一个正整数 N(1≤N≤100)和 N 个整数,用空格分隔。

Output
将这 N 个数中的偶数按从大到小的顺序输出

Sample Input
10 8 4 14 2 11 30 40 500 17 100 8 80 200 99 -12 34 55 88 11

Sample Output
500 100 40 30 14 8 4 2 200 88 80 34 -12

#include<stdio.h> int main() { int i,j,t,n; int a[101],b[101]; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<=n;i++){ for(j=i;j<=n;j++){ if(a[i]<a[j]){ t=a[i]; a[i]=a[j]; a[j]=t; } else continue; }}

for(i=1;i<=n;i++){ if(a[i]%2==0){ if(i!=n) printf("%d ",a[i]); else printf("%d\n",a[i]); } } } }

Problem B: 零起点学算法 92——元素前 移1位
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1934 Solved: 1231

Description
将数组所有元素前移一位(最前面的元素移到最后)然后输出移动后的数组

Input
多组测试数据,每组第一行输入一个整数 n(不大于 20)第二行输入 n 个整数

Output
输出前移一位后的数组

Sample Input
4 1 2 3 4

Sample Output
2 3 4 1

#include<stdio.h> int main() { int n,m,i,j,k; int a[20],b[20]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n-1;i++) { b[i]=a[i+1]; printf("%d ",b[i]); } printf("%d\n",a[0]); } return 0; }

Problem C: 零起点学算法 86——Fibonacc
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1798 Solved: 983

Description
Fibonacci 数列定义为(1,1,2,3,5,8,.....),即每个元素是前两个元素的 和。如果一个 Fibonacci 数与所有小于它的 Fibonacci 数互质,那么称之为 Fibonacci 质数。现在要求你输出前 n 个 Fibonacci 数 The Fibonacci Numbers {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...} are defined by the recurrence: F(0)=0 F(1)=1 F(i)=F(i-1)+F(i-2) Write a program to calculate the Fibonacci Numbers.

Input

The first line of the input file contains a single integer T, the number of test cases. The following T lines,each contains an integer n ( 0 <= n <= 45 ), and you are expected to calculate Fn.

Output
Output Fn on a separate line.

Sample Input
5 0 3 5 9 20

Sample Output
0 2 5 34 6765
#include<stdio.h> int f(int n); main() { int t,i; int n,c[50]; scanf("%d",&t); for(i=0;i<t;i++) scanf("%d",&c[i]); for(i=0;i<t;i++){ n=c[i]; f(n); }}

int f(int n) { int i,f1=1,f2=1,f3; if(n==0) printf("0\n"); else if(n==1||n==2) { printf("1\n"); } else { for(i=0;i<n-2;i++) { f3=f1+f2; f2=f1; f1=f3; } printf("%d\n",f1); } }

3542: 插入一个数到数列中
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3257 Solved: 1671

Description
已有一个排序好的数列:0 10 20 30 40 50 60 70 80,输入一个任意整数 m, 按序插入到正确位置,输出插入 m 后的数列。

Input
多组测试数据,每组输入一个整数 m

Output
输出插入 m 后的数列

Sample Input

35 -5 90

Sample Output
0 10 20 30 35 40 50 60 70 80 -5 0 10 20 30 40 50 60 70 80 0 10 20 30 40 50 60 70 80 90
#include<stdio.h> int main() { int n,m,i,l,j,k; int a[20],b[20]; while(scanf("%d",&m)!=EOF){ for(i=0;i<9;i++){ a[i]=10*i; } for(i=0;i<10;i++){ if(m<a[i]) break; } if(i!=10){ for(j=9;j>i;j--) a[j]=a[j-1]; a[i]=m; } else a[9]=m; for(i=0;i<10;i++){ if(i!=9) printf("%d ",a[i]); else printf("%d\n",a[i]); } } }

3539: N 个数从小到大排序
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 5854 Solved: 2635

Description
输入一个正整数 N 和 N 个整数,将它们按从小到大的顺序进行排序后输出。

Input
多组测试数据,每组输入一个正整数 N(1≤N≤100)和 N 个整数,用空格分隔。

Output
将这 N 个数按从小到大的顺序重新输出

Sample Input
10 -4 5 12 88 23 -9 2 0 8 10 5 12 3 4 9 -2

Sample Output
-9 -4 0 2 5 8 10 12 23 88 -2 3 4 9 12
#include<stdio.h> int main() { int i,j,t,n; int a[101],b[101]; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<=n;i++){

for(j=i;j<=n;j++){ if(a[i]>a[j]){ t=a[i]; a[i]=a[j]; a[j]=t; } else continue; }} for(i=1;i<=n;i++){ if(i!=n) printf("%d ",a[i]); else printf("%d\n",a[i]); } } }

3537: 最大数与数列最后一个数交换
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4345 Solved: 1875

Description
输入一个正整数 n( 1 < n < 100),再输入 n 个整数,将最后一个数与数列最大 数交换位置(若最大数在数列最后,就不用交换),输出交换后的 n 个数。

Input
多组测试数据,每组先输入一个正整数 n,再输入 n 个整数

Output
输出交换后的数列(即最大数在数列最后位置)

Sample Input

5 3 5 2 8 1 9 88 33 55 99 44 66 77 22 11

Sample Output
3 5 2 1 8 88 33 55 11 44 66 77 22 99
#include<stdio.h> int main() { int i,j,max,n; int a[100]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); max=a[0]; j=0; for(i=1;i<n;i++) { if(a[i]>max) { max=a[i]; j=i; } } a[j]=a[n-1]; a[n-1]=max; for(i=0;i<n-1;i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); } return 0; }

3886: 零起点学算法 85——数组中插入一 个数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3497 Solved: 1250

Description
给定有序数组(从小到大),再给你一个数,要求插入该数到数组中并保持顺序

Input
多组测试,每组第一行输入一个整数 n,然后是 n 个有序的整数第二行输入 1 个整 数 m 和 1 个整数 K

Output
将整数 m 插入到原数组中保持顺序是升序,然后输出 2 行第一行是插入以后的数组 第二行是插入以后的数组中下标值是 K 的数 n m k 不超过 20

Sample Input
3 1 2 5 3 1

Sample Output
1 2 3 5 2
#include<stdio.h> int main() { int n,m,i,l,j,k; int a[21],b[21]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ scanf("%d",&a[i]);

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

3885: 零起点学算法 84——数组中删数 II
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4532 Solved: 1678

Description
在给定的数组中删除数

Input
多组测试,每组第一行输入 1 个整数 n(n<20),然后是 n 个整数 第二行输入 1 个 整数 m

Output

删除在第一行的 n 个整数中的数字 m(多个的话都要删除),然后按照顺序输出剩 下的数,

Sample Input
5 1 2 3 4 3 3

Sample Output
1 2 4
#include<stdio.h> int main() { int n,m,i,l,j,k; int a[21],b[21]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ scanf("%d",&a[i]); } scanf("%d",&m); for(i=0;i<n;i++){ if(m==a[i]) { if(i!=n-1) continue; else printf("\n"); } else { if(i!=n-1) printf("%d ",a[i]); else printf("%d\n",a[i]); } } } }

Problem A: 零起点学算法 83——数组中 删数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 7443 Solved: 2254

Description
在给定的数组中删除一个数

Input
多组测试,每组第一行输入 1 个整数 n(n<20),然后是 n 个整数 第二行输入 1 个 整数 m

Output
删除在第一行的 n 个整数中第一次出现数字 m 并删除, 然后按照顺序输出剩下的数,

Sample Input
4 1 2 3 4 3

Sample Output
1 2 4

HINT
m 有可能在原数组中找不到,找不到则输出原数组
#include <stdio.h> int main(){ int n,a[20],i,m; while(scanf("%d",&n)!=EOF) {

for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(i=0;i<n;i++) if(a[i]==m){ int j; for(j=i;j<n-1;j++) a[j]=a[j+1]; break; } int t=n-1; if(i!=n)t--; for(i=0;i<t;i++) printf("%d ",a[i]); printf("%d\n",a[i]); } return 0; }

Problem A: 零起点学算法 82——数组中 查找数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 7125 Solved: 3536

Description
在给定的数组中查找一个数

Input
多组测试,每组第一行输入 1 个整数 n(n<20),然后是 n 个整数第二行输入 1 个 整数 m

Output
查找在第一行的 n 个整数中第一次出现数字 m 的下标位置并输出,如果没有找到则 输出 No

Sample Input

3 4 5 6 5 4 2 2 2 2 2

Sample Output
1 0
#include<stdio.h> int main() { int n,a[20]; int i,j,m; while (scanf("%d", &n) != EOF) { for(i=0; i<n; i++) { scanf("%d",&a[i]); } scanf("%d",&m); for(j=0; j<n; j++) { if(a[j]==m) { printf("%d\n",j); break; } } if(j == n) printf("No\n"); } return 0; }

Problem A: 零起点学算法 81——找出数 组中最大元素的位置(下标值)
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 8840 Solved: 3524

Description
找出数组中最大的元素的下标。

Input
多组测试,每组先输入一个不大于 10 的整数 n 然后是 n 个整数

Output
输出这 n 个整数中最大的元素及下标值

Sample Input
4 1 4 5 6

Sample Output
6 3
#include<stdio.h> int main() { int n,a[10],i,j,max; while(scanf("%d",&n)!=EOF) { max=0;j=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); if(max<a[i]){max=a[i];j=i;} } printf("%d %d\n",max,j); }

return 0; }

Problem A: 零起点学算法 80——逆序输 出(数组练习)
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 8884 Solved: 3256

Description
数组是在程序设计中, 为了处理方便, 把具有相同类型的若干变量按有序的形式组 织起来的一种形式。 这些按序排列的同类数据元素的集合称为数组数组类型说明 在 C语言中使用数组必须先进行类型说明。 数组说明的一般形式为: 类型说明 符 数组名 [常量表达式],……; 其中,类型说明符是任一种基本数据类型或构造 数据类型。 数组名是用户定义的数组标识符。 方括号中的常量表达式表示数据元 素的个数,也称为数组的长度。例 int a[10]; 说明整型数组 a,有 10 个元 素。 float b[10],c[20]; 说明实型数组 b,有 10 个元素,实型数组 c, 有 20 个元素。 char ch[20]; 说明字符数组 ch,有 20 个元素。

Input
多组测试数据。 第一行输入一个整数 T 表示测试数据组数每组首先输入 1 个整数 n, 然后输入 n 个整数(不大于 20)

Output
对于每组测试数据按照输入相反的顺序输出 n 个数据

Sample Input
2 3 1 2 3 5

2 3 1 4 5

Sample Output
3 2 1 5 4 1 3 2
#include<stdio.h> int main() { int T,j,n,i; scanf("%d",&T); for(j=1;j<=T;j++) { scanf("%d",&n); int a[1000]; for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=n-1;i>=1;i--) { printf("%d ",a[i]); } printf("%d\n",a[0]); } return 0; }

3510: 完数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3850 Solved: 2047

Description
一个数如果恰好等于它的因子之和, 这个数就称为“完数”。 例如 6 的因子有: 1, 2, 3;由于 6=1+2+3,所以 6 是完数。要求对于输入的任意一个正整数,验证它是否 是完数。

Input
多组测试数据,输入正整数 n(n≥2)。

Output
如果是完数,输出“xxx is cloze.”;否则输出“xxx is not cloze.”。这里 的 xxx 是输入的整数。

Sample Input
6 28 42

Sample Output
6 is cloze. 28 is cloze. 42 is not cloze.

#include<stdio.h> int main() { int n,i,s; while(scanf("%d",&n)!=EOF) { s=0; for(i=2;i<=n;i++) { if(n%i==0)s=n/i+s; } if(s==n) printf("%d is cloze.\n",n); else printf("%d is not cloze.\n",n); } return 0; }

2429: 绝配队伍
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 7291 Solved: 3876

Description
经过了 ACM 集训选拔后,不少同学参加了暑假集训。暑假集训后,老师为大家组队 (三个人一组),组队时我们一般遵守下面的原则: (1)尽量自愿。 (2)尽量互补。即专业跨度大一些,知识点掌握程度尽量不一样 为了增加趣味性,老师让同学各自报一个数字,然后三人自愿组合成一个队,并将 3 人组合成的数报上来,如果这 3 人组成的数是水仙花数,我们认为这就是绝配队 伍。 水仙花数是指一个 3 位数,它的每个位上的数字的 3 次幂之和等于它本身。(例 如:1^3 + 5^3+ 3^3 = 153)

Input
多组测试数据,每组输入一个 3 位整数

Output
每组输出一行,如果是水仙花数则输出"Yes“,否则输出"No"

Sample Input
153 610

Sample Output
Yes No

#include<stdio.h> int main() { int n,a,b,c; while(scanf("%d",&n)!=EOF) { a=n/100; b=n/10%10; c=n%10; if(a*a*a+b*b*b+c*c*c==n) printf("Yes\n"); else printf("No\n"); } return 0; }

3519: 输入任意 N 个数,求和
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1919 Solved: 1206

Description
输入一个整数 N 和 N 个整数,计算这 N 个整数的和。

Input
多组测试数据,每组先输入一个整数 n(1≤n≤100),然后再输入 n 个整数,用空 格分隔。

Output
n 个数的和。

Sample Input
6 11 19 2 7 8 31 4 11 23 8 1

Sample Output
s=78

s=43
#include<stdio.h> int main() { int n,i; int m,s=0; while(scanf("%d",&n)!=EOF&&n!=0) { s=0; for(i=1;i<=n;i++) { scanf("%d",&m); s=s+m; } printf("s=%d\n",s); } return 0; }

Problem A: 计算数列和
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3558 Solved: 2038

Description
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…… 计算这个数列的前 n 项和。

Input
多组测试数据,每组输入一个正整数 n。(n≥1)

Output
输出数列的前 n 项和(保留两位小数),输出格式可为: printf("s=%.2f\n",..);。

Sample Input
10 15

20

Sample Output
s=16.48 s=24.57 s=32.66
#include<stdio.h> int main() { int n; while(scanf("%d",&n)!=EOF) { int a[1000]; int i; double t=2; a[0]=1; a[1]=2; for(i=2;i<=n;i++) { a[i]=a[i-1]+a[i-2]; } for(i=1;i<n;i++) { t+=1.0/a[i]*a[i+1]; } printf("s=%.2lf\n",t); } return 0; }

Problem A: 指针:调用自定义交换函数, 完成三个数整从小到大排列
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4493 Solved: 2942

Description
调用自定义交换函数 swap(int *p1, int *p2),完成三个整数从小到大排列

Input
多组测试数据,每组输入三个任意整数

Output
输出从小到大排列的三个数

Sample Input
9 2 7 0 -2 12 8 3 1

Sample Output
2 7 9 -2 0 12 1 3 8

#include<stdio.h> void swap(int*p1, int*p2) { int p; p=*p1; *p1=*p2; *p2=p; } int main(void) { int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { if(a>b) swap (&a,&b); if(a>c) swap (&a,&c); if(b>c) swap (&b,&c); printf("%d %d %d\n",a,b,c); } return 0;

}

Problem B: 指针:调用自定义交换函数, 完成 5 个浮点数从小到大排列
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3704 Solved: 2071

Description
自定义函数 swap(float *p1, float *p2),调用它完成任意 5 个浮点数从小到 大排列。

Input
多组测试数据,每组输入 5 个任意浮点数。

Output
输出从小到大排列的 5 个数,输出一位小数,数据之间空格隔开。

Sample Input
5.5 4.4 3.3 2.2 1.1 3.1 2 0 7.2 5.4 7.2 -3.4 0 -2 1.2

Sample Output
1.1 2.2 3.3 4.4 5.5 0.0 2.0 3.1 5.4 7.2 -3.4 -2.0 0.0 1.2 7.2

#include<stdio.h> void swap(float*p1, float*p2) { float p; p=*p1;

*p1=*p2; *p2=p; } int main(void) { float a,b,c,d,e; while(scanf("%f%f%f%f%f",&a,&b,&c,&d,&e)!=EOF) { if(a>b) swap (&a,&b); if(a>c) swap (&a,&c); if(a>d) swap (&a,&d); if(a>e) swap (&a,&e); if(b>c) swap (&b,&c); if(b>d) swap (&b,&d); if(b>e) swap (&b,&e); if(c>d) swap (&c,&d); if(c>e) swap (&c,&e); if(d>e) swap (&d,&e); printf("%.1f %.1f %.1f %.1f %.1f\n",a,b,c,d,e); } return 0; }

Problem C: 指针:有 n 个整数,使其前面 各数顺序向后移 m 个位置, 最后 m 个数变 成最前面 m 个数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2344 Solved: 1448

Description
调用自定义后移函数 move(int *a, int n, int m)来进行循环移位, 对 n(n<20) 个整数, 使其前面各数顺序向后移 m 个位置, 最后 m 个数变成最前面 m 个数, 如下: n=10, m=3 时:输入:1 2 3 4 5 6 7 8 9 10,输出:8 9 10 1 2 3 4 5 6 7

Input
输入多组测试数据,每组先输入 n(n < 20)和 m(m < n),再输入 n 个整数。

Output
输出循环移动 m 个数后的序列,数据间空格隔开。

Sample Input
10 4 1 2 3 4 5 6 7 8 9 10 7 2 1 2 3 4 5 6 7

Sample Output
7 8 9 10 1 2 3 4 5 6 6 7 1 2 3 4 5

#include<stdio.h> void move(int *a, int n, int m) { int b[20],i; for(i=0;i<m;i++) {b[i]=a[n-m+i];} for(i=n-1;i>=m;i--) {a[i]=a[i-m];} for(i=0;i<m;i++) {a[i]=b[i];} } int main() { int i,n,m,a[20]; while(scanf("%d%d",&n,&m)==2) { for(i=0;i<n;i++) {scanf("%d",a+i);} move(a,n,m); for(i=0;i<n;i++) {printf("%d%c",a[i],i==n-1?'\n':' '); } } }

Problem D: 指针:调用自定义排序函数 sort,对输入的 n 个数进行从小到大输出。
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3437 Solved: 1931

Description
自定义函数 sort(int *p, int n),功能是对 n 个数排序。在 main 函数中, 调用它,对输入的任意个数排序。

Input
多组测试数据,先输入 n(n<100),再输入 n 个任意整数

Output
输出从小到大排列后的数组

Sample Input
5 9 4 3 2 1 6 34 23 12 78 -20 0

Sample Output
1 2 3 4 9 -20 0 12 23 34 78

Problem E: 指针:自定义函数 sumDiff(), 调用它来求两个数的和、差
Time Limit: 1 Sec Memory Limit: 64 MB

Submit: 4459 Solved: 3120

Description
自定义一个计算两个数和、差的函数 sumDiff(int op1, int op2, int *pSum, int *pDiff),功能是求两个数 op1、op2 的和、差,其中*psum 和*pdiff 是计 算得出的和与差。在 main 函数中,调用它,计算输入的任意两个数的和与差。

Input
多组测试数据,每组输入两个任意整数。

Output
输出两个数的和与差,空格隔开。

Sample Input
3 5 9 8

Sample Output
sum=8 diff=-2 sum=17 diff=1

Problem F: 自定义函数 strcomp(), 实现两 个字符串的比较
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2103 Solved: 1417

Description
编写函数 strcomp(char *s1, char *s2),实现两个字符串的比较,返回值为

1、0 或-1,分别表示 s1>s2,s1=s2,s1<>

Input
多组测试数据,每组输入两个字符串(字符串长度小于 80)。

Output
根据字符串的大小关系,输出 1、0 或-1

Sample Input
china chinese world hello sea sea

Sample Output
-1 1 0

Problem G: 结构体:计算输入日期是该年 的第几天
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 5719 Solved: 3139

Description
定义一个结构体变量(包括年、月、日),输入一个日期,计算并输出该日是本年中

的第几天.

Input
多组测试数据,每组输入年-月-日

Output
输出其在该年中对应的天数

Sample Input
2006-10-1

Sample Output
274

Description
定义一个学生结构体,含学号(字符型)、姓名、2 门课程的成绩。从键盘输入 3 个 学生的信息,计算并输出每个学生的平均成绩。

Input
按学号、姓名、成绩 1、成绩 2 的顺序输入学生信息

Output
输出每个学生的平均分

Sample Input
101 Xue 87 90

102 Lin 98 92 103 Liu 89 83

Sample Output
ave[0]=88.5 ave[1]=95.0 ave[2]=86.0

#include<stdio.h> struct student {

int num; char name[20]; int score1; int score2;

}stu[3]; void main() { int t1,t2,t3; struct student *p; for(p=stu;p<stu+3;p++) {scanf("%d\n%c\n%d\n%d\n"); t1=(stu[0].score1+stu[0].score2)/2.0; t2=(stu[1].score1+stu[1].score2)/2.0; t3=(stu[2].score1+stu[2].score2)/2.0; } printf("ave[1]=%.1f\n",t1); printf("ave[2]=%.1f\n",t2); printf("ave[3]=%.1f\n",t3); }

Problem I: 结构体:求最高分和最低分
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3220 Solved: 2220

Description
定义一个学生结构体,含学号(字符型) 、姓名、成绩 ( 整型 ) 。从键盘输入数字 n(n<20),并输入 n 个学生的信息,输出最高分和最低分同学的信息。

Input
多组测试数据,每组输入一个 n,接着输入 n 个学生的信息。

Output
输出最高分和最低分同学的学号、姓名、成绩。

Sample Input
4 1001 Li 76 1002 Zhang 92 1003 Liu 85 1004 Wang 70

Sample Output

1002 Zhang 92 1004 Wang 70

Problem J: 结构体:按成绩排序
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 3753 Solved: 2441

Description
定义一个学生结构体,含学号(一维字符数组) 、姓名、成绩(整型) 。从键盘输入 n(n<20),再输入 n 个学生的信息,按学生成绩从小到大顺序输出学生信息。

Input
多组测试数据,每组输入一个 n,接着输入 n 个学生的信息。

Output
按成绩从小到大顺序输出学生信息。

Sample Input
4 1001 Li 76 1002 Zhang 92 1003 Liu 85

1004 Wang 70

Sample Output
1004 Wang 70 1001 Li 76 1003 Liu 85 1002 Zhang 92

Problem A: 深入浅出学算法 001-求最大 公约数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1824 Solved: 1066

Description
求 2 个整数 a、b(a>b)的最大公约数。

Input
多组测试数据,第一行输入整数 T,表示组数然后是 T 行,每行输入 2 个整数分别 代表 a 和 b

Output
对于每组测试数据输出 1 行,值为 a 和 b 的最大公约数

Sample Input
2

18 12 6 5

Sample Output
6 1

HINT
c 语言基础不够扎实的赶快到第 29 页去饿补吧 多组测试数据输入输出不清楚的赶快去做 3838 到 3843 的题目,以后不说就是多 组
#include<stdio.h> int main() { int a,b,n,t,j,m; scanf("%d",&n); while(scanf("%d%d",&a,&b)!=EOF) { for(j=a;j>=1;j--) { if(a%j==0&&b%j==0) break; } printf("%d\n",j); } return 0; }

Problem B: 深入浅出学算法 002-n 个 1
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1834 Solved: 588

Description
由 n 个 1 组成的整数能被 K(K<10000)整除,n 至少为多少?

Input
多组测试数据,第一行输入整数 T,表示组数 然后是 T 行,每行输入 1 个整数代表 K

Output
对于每组测试数据输出 1 行,值为 n

Sample Input
1 11

Sample Output
2

#include <stdio.h> int main() { int c, n, m, r, p; scanf("%d", &c); while(c--) { scanf("%d", &m); if(!(m&1) || (m%10==5)) { printf("-1\n"); continue; } p = 1; r = 1; n = 1; while(r%m != 0) { p = p*10%m; r = (r+p)%m; n++; }

printf("%d\n", n); } return 0; }

Problem C: 深入浅出学算法 003-计算复 杂度
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 784 Solved: 305

Description
算法复杂度一般分为:时间复杂度、空间复杂度、编程复杂度。这三个复杂度本身 是矛盾体,不能一味地追求降低某一复杂度,否则会带来其他复杂度的增加。在权 衡各方面的情况下,降低时间复杂度成为本课程学习的重点之一。请计算下面几个 程序段的复杂程度,分别用 1、logn、n、nlogn、n^2、n^3 或 2^n 来表示
程序片段 1: x=x+1;

程序片段 2: for(k=1;k<=n;k++) { x=x+1; }

程序片段 3 : for(k=1,t=1;k<=n;k++) { t=t*2; for(j=1;j<=t;j++) x=x+j; } 程序片段 4: for(k=1;k<=n;k++) { for(j=1;j<=k;j++) x=x+j; } 程序片段 5: m=0; for(k=1,t=1;k<=n;k++) { t=t*2; for(j=t;j<=n;j++) m++; } 程序片段 6: m=0; for(k=1;k<=n;k++) { for(j=1;j<=n;j++) m++; } 程 序 片 段 7 : m=0; for(k=1;k<=n;k++) { for(j=1;j<=n;j++) for(i=1;i<=n;i++) m++; }

Input
多组测试数据,首先在第一行输入整数 T 表示提问次数然后是 n 行,每行是 1 个整

数,表示程序片段号

Output
对于每次提问,在 1 行输出对应程序片段对应的复杂程度(注意必须按前面提示的 输出,注意大小写

Sample Input
2 1 2

Sample Output
1 n

#include <stdio.h> int main() { int i,T,a; scanf("%d",&T); for(i=1;i<=T;i++) { scanf("%d",&a); if(a==1) printf("1\n"); else if(a==2) printf("n\n"); else if(a==3) printf("2^n\n"); else if(a==4) printf("n^2\n"); else if(a==5) printf("nlogn\n"); else if(a==6) printf("n^2\n"); else if(a==7) printf("n^3\n"); }

return 0; }

Problem D: 深入浅出学算法 004-求多个 数的最小公倍数
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1257 Solved: 329

Description
求 n 个整数的最小公约数

Input
多组测试数据,先输入整数 T 表示组数然后每行先输入 1 个整数 n,后面输入 n 个 整数 k1 k2...kn

Output
求 k1 k2 ...kn 的最小公倍数

Sample Input
1 3 12 18 6

Sample Output
36

Problem E: 深入浅出学算法 005-数 7
Time Limit: 1 Sec Memory Limit: 64 MB

Submit: 3698 Solved: 954

Description
逢年过节,三五好友,相约小聚,酒过三旬,围桌数七。 “数七”是一个酒桌上玩 的小游戏。就是按照顺序,某人报一个 10 以下的数字,然后后面的人依次在原来 的数字上加 1,并喊出来,当然如果要喊的数包含 7 或者是 7 的倍数,那么不能直 接喊,可以敲一下筷子,否则就算输,要罚酒一杯。

Input
多组测试数据,先输入整数 T 表示组数,每组测试数据输入一个 10 以下的正整数,

Output
对于每组测试数据,输出在一行,要求从小到大输出所报数(含)到 100 之间所有 不能喊的数字

Sample Input
1 3

Sample Output
7 14 17 21 27 28...

#include<stdio.h> int main() { int T,k,i,j; scanf("%d",&T); for(i=1;i<=T;i++) { scanf("%d",&k); for(j=k;j<=97;j++) if(j%7==0||j%10==7||j/10==7) printf("%d ",j); printf("98\n"); } return 0;

}

Problem F: 深入浅出学算法 006-求不定方 程的所有解
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2018 Solved: 871

Description
现有一方程 ax+by=c,其中系数 a、b、c 均为整数,求符合条件的所有正整数解, 要求按 x 由小到大排列,其中 a b c 均为不大于 1000 的正整数

Input
多组测试数据,第一行先输入整数 T 表示组数然后每组输入 3 个整数分别表示 a b c

Output
对于每组数据按要求输出所有正整数解有多个解的情况下,每对解一行,要求按照 x 从小到大输出无解时输出 No

Sample Input
1 1 2 3

Sample Output
1 1

Problem G: 深入浅出学算法 007-统计求 和

Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1858 Solved: 821

Description
求含有数字 a 且不能被 a 整除的 4 位整数的个数,并求这些整数的和

Input
多组测试数据,先输入整数 T 表示组数然后每组输入 1 个整数 a(1<=a<=9)

Output
对于每组测试数据输出一行,每行 2 个数分别是个数与和

Sample Input
1 3

Sample Output

Problem B: 均分纸牌
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1662 Solved: 804

Description
有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的 倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 堆上取 的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号 为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求 找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如 N=4,4 堆 纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动 3 次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10) -> 从 ② 取 1 张牌放到①(10 10 10 10) 。

Input
有多个测试案例,每个测试案例第 1 行输入 N(N 堆纸牌,1 <= N <= 100)第 2 行输入 A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)如果输 入 N=0,则表示结束

Output
对每个测试案例,输出一行,内容为使所有堆均达到相等时的最少移动次数。

Sample Input
4 9 8 17 6 0

Sample Output
3

HINT
#include<stdio.h> int main() { int i, n,ave,a; int s[105]; while(scanf("%d",&n)!=EOF&&n!=0) { ave=0; for(i=0;i<n;i++) { scanf("%d",&s[i]); ave+=s[i]; } ave/=n; a=0; for(i=0;i<n;i++) { s[i]-=ave; if(s[i]!=0)

{ a++; s[i+1]+=s[i]; }} printf("%d\n",a); } return 0; }

Problem C: 连数问题
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1541 Solved: 744

Description
设有 n 个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3 时,3 个整数 13,312,343, 连成的最大整数为 :34331213 又如 :n=4 时 ,4 个整数 7,13,4,246 连接成的最大整数为 7424613

Input
N N 个数

Output
连接成的多位数

Sample Input
3 13 312 343 0

Sample Output
34331213

#include <stdio.h>

int CompareInt(int a,int b) { int a1=a,b1=b,la=10,lb=10; while(a/la) { la*=10; } while(b/lb) { lb*=10; } return (a*lb+b)-(b*la+a); } int main() { int i,j,n; int data[20],temp; while(1) { scanf("%d",&n); if(n<=0||n>20) break; for(i=0;i<n;i++) { scanf("%d",&data[i]); } for(j=0;j<n-1;j++) for(i=0;i<n-1-j;i++) { if(CompareInt(data[i],data[i+1])<0) { temp=data[i+1]; data[i+1]=data[i]; data[i]=temp; } } for(i=0;i<n;i++) { printf("%d",data[i]); } printf("\n"); } return 0;}

Problem A: Delete Number
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2561 Solved: 781

Description
Given 2 integer number n and m. You can delete m digits from the number n, then number n changes to a new number n1. Tell me how to delete the number, you can get the smallest one. For example,
m: 1 n: 1456

n1 may be 145, 156, 146, 456 the smallest one is 145. Then n1 should be 145.

Input
The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case consists of one single line containing two integer number m(1 <= m <= 1000), and n(1 <= n < 101000).

Output
Your program must output a single line for each test case. The line should contain the number n1.

Sample Input
1 1 1456

Sample Output
145

#include <stdio.h> #include <string.h> void del (char *p)

{ while (*p!='\0') { *p=*(p+1); p++; } } int main() { int T;char c; scanf ("%d",&T); while (T--) { char str[1000]; int n; char *p; scanf ("%d",&n); scanf ("%s",str); p=str+1; while (*p!='\0') { if (*(p-1)>*p&&n>0) { del (p-1); n--; p=str+1; continue; } p++; } while (n) { p--; del(p); n--; } while (str[0]=='0') { strcpy(str,str+1); } if(str[0]=='\0')printf("0"); printf ("%s\n",str); } return 0;

}

Problem E: Packets
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 357 Solved: 166

Description
A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These products are always delivered to customers in the square parcels of the same height h as the products have and of the size 6*6. Because of the expenses it is the interest of the factory as well as of the customer to minimize the number of parcels necessary to deliver the ordered products from the factory to the customer. A good program solving the problem of finding the minimal number of parcels necessary to deliver the given products according to an order would save a lot of money. You are asked to make such a program.

Input
The input file consists of several lines specifying orders. Each line specifies one order. Orders are described by six integers separated by one space representing successively the number of packets of individual size from the smallest size 1*1 to the biggest size 6*6. The end of the input file is indicated by the line containing six zeros.

Output
The output file contains one line for each line in the input file. This line contains the minimal number of parcels into which the order from the corresponding line of the input file can be packed. There is no line in the output file corresponding to the last ``null'' line of the input file.

Sample Input
0 0 4 0 0 1 7 5 1 0 0 0

0 0 0 0 0 0

Sample Output
2 1

HINT

#include<iostream> #include<cstdio> using namespace std; int main() { int p[4]={0,5,3,1},a[10]; while(1) { int sum=0; for(int i=1;i<=6;i++) { scanf("%d",&a[i]); sum+=a[i]; } if(sum==0) break; sum=0; sum=a[4]+a[5]+a[6]+a[3]/4; if(a[3]%4!=0) sum++; int need2=a[4]*5+p[a[3]%4]; if(need2<a[2]) { sum+=(a[2]-need2)/9; if((a[2]-need2)%9!=0) sum++; } int need1=sum*36-a[2]*4-a[3]*9-a[4]*16-a[5]*25-a[6]*36; if(need1<a[1]) { sum+=(a[1]-need1)/36;

if((a[1]-need1)%36!=0) sum++; } printf("%d\n",sum); } return 0; }

Problem F: Box of Bricks
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 598 Solved: 268

Description
Little Bob likes playing with his box of bricks. He puts the bricks one upon another and builds stacks of different height. "Look, I've built a wall!", he tells his older sister Alice. "Nah, you should make all stacks the same height. Then you would have a real wall.", she retorts. After a little con- sideration, Bob sees that she is right. So he sets out to rearrange the bricks, one by one, such that all stacks are the same height afterwards. But since Bob is lazy he wants to do this with the minimum number of bricks moved. Can you help?

Input
The input consists of several data sets. Each set begins with a line containing the number n of stacks Bob has built. The next line contains n numbers, the heights hi of the n stacks. You may assume 1 <= n <= 50 and 1 <= hi <= 100. The total number of bricks will be divisible by the number of stacks. Thus, it is always possible to rearrange the bricks such that all stacks have the same height. The input is terminated by a set starting with n = 0. This set should not be processed.

Output
For each set, first print the number of the set, as shown in the sample output. Then print the line "The minimum number of moves is k.", where k is the minimum number of bricks that have to be moved in order to make all the stacks the same height. Output a blank line after each set.

Sample Input
6 5 2 4 1 7 5 0

Sample Output
Set #1 The minimum number of moves is 5.

#include <stdio.h> #include <algorithm> using namespace std; int main() { int n,cas = 1; while(~scanf("%d",&n),n) { int a[100],i,sub = 0; for(i = 0;i<n;i++) { scanf("%d",&a[i]); sub+=a[i]; } sub = sub/n; sort(a,a+n); int sum = 0; printf("Set #%d\nThe minimum number of moves is ",cas++); while(a[n-1]>sub) {

if(a[n-1]-sub>sub - a[0]) { sum+=sub-a[0]; a[n-1] = a[n-1] - (sub-a[0]); } else if(a[n-1]-sub == sub - a[0]) { sum+=a[n-1]-sub; a[n-1] = sub; a[0] = sub; } else { sum += a[n-1] - sub; a[n-1] = sub; a[0] = a[0] + a[n-1] - sub; } sort(a,a+n); } printf("%d.\n\n",sum); } return 0; }

最长不下降序列
Time Limit:1000MS Memory Limit:65536K Total Submit:488 Accepted:197

Description
有由 n 个不相同的整数组成的数列,记为 a(1)、a(2)、...a(n),当 i!=j 时,a(i)!=a(j)。 若存在 i1 < i2 < i3 < ... < ie,且有 a(i1) < a(i2) < ... < a(ie), 则称为长度为 e 的不下降 序列。

如 3,18,7,14,10,12,23,41,16,24 则有 3,18,23,24 是一个长度为 4 的不下降子序列 3,7,10,12,23,24 是长度为 6 的不下降子序列。 现要求你求最长的不下降子序列。

Input
多组测试数据 每组一行,先输入一个数列长度 n (1 <= n <= 1000),然后是 n 个整数 处理到文件末尾

Output
输出最长不下降子序列的长度

Sample Input
10 3 18 7 14 10 12 23 41 16 24

Sample Output
6 简单动态规划题,给予我们一种思想!! 代码如下:
#include<stdio.h> int Longest_Increasing(int num[],int List[],int n)//List[i]为包含 i 项在内的最长不下降子序列 { int i,j; for(i=1;i<n;i++) { for(j=0;j<i;j++)

{ if(num[i]>num[j]&&List[i]<List[j]+1) List[i]=List[j]+1; } } return 0; } int main() { int n,i,ans; int num[1001],List[1001]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { List[i]=1; scanf("%d",&num[i]); } Longest_Increasing(num,List,n); printf("最优解:\n"); for(i=0;i<n;i++) printf("%d ",List[i]); printf("\n");*/ ans=0; for(i=0;i<n;i++) if(List[i]>ans) ans=List[i]; printf("%d\n",ans); } return 0; }

/**//*

最长公共子序列
问题描述: 给定序列 X={x1,x2,..xn}和 Y={y1,y2...ym},求一个 Z={z1,z2,..zk}序列是 X,Y 的最 长公共子序列!!

书上描述的已经十分详细了,而且容易理解。通过定义 c[i][j]用于记录 Xi 和 Yi 的最长公共 子序列的长度,从而递推得到结果。

递推方程如下: c[i][j]=0,i=0,j=0; c[i][j]=c[i-1][j-1]+1,xi=yj; c[i][j]=max(c[i-1][j],c[i][j-1]),xi!

=yj; (不知道怎么输出大括号,悲剧啊!)

代码如下: #include<stdio.h> void LCSLength(int m,int n,char *x,char *y,int c[][100],int b[][100]) { int i,j; for(i=1;i<=m;i++) c[i][0]=0; c[i][j]当然为 0 for(j=1;j<=n;j++) c[0][j]=0; //当 i==0 或者 j==0 时, 代表其中一个序列为空,

for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else { if(c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2;

//二重循环

} else { c[i][j]=c[i][j-1]; b[i][j]=3; } } } }

void LCS(int i,int j,char x[],int b[][100]) //递归求得最长子序列 { if(i==0||b==0) return; if(b[i][j]==1) { LCS(i-1,j-1,x,b); printf("%c",x[i]); } else if(b[i][j]==2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b); }

int main() { char x[100],y[100];

int i,j; int c[100][100],b[100][100]; scanf("%s %s",x+1,y+1); c[0][0]=0; LCSLength(7,6,x,y,c,b); for(i=0;i<8;i++) { for(j=0;j<7;j++) { printf("%d ",c[i][j]); } printf("\n"); } LCS(7,6,x,b); printf("\n"); return 0; }

数字三角形
Time Limit:1000MS Memory Limit:65536K Total Submit:565 Accepted:328

Description

下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的 一条路径,使该路径所经过的数字的总和最大。 (1)每一步可沿左斜线向下或右斜线向下 (2)1 < 三角形行数 < 100 (3)三角形数字为 0,1,...99

Input
有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第 1 行是输入整数(如果该整数是 0,就表示结束, 不需要再处理),表示三角形行数 n,然后是 n 行数

Output
输出最大数字和

Sample Input
5 7 3 8 2 4

8 1 0 7 4 4 5 2 6 5

Sample Output
30
数塔,动态规划,每个点最大值是它的值加上下面的两个点后最大的值,所以从 底向上递归,就可以求出顶的最大值。我就是从这道题接触,理解了动态规划原 理的。DP 入门题。 #include<stdio.h> #include<stdlib.h> const int maxn=110; int a[maxn][maxn],b[maxn][maxn],n; void data_set(){ for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ scanf("%d",&a[i][j]); } } } void solve(){ for(int j=1;j<=n;j++) b[n][j]=a[n][j]; for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++){ if(b[i+1][j+1]>b[i+1][j]) b[i][j]=b[i+1][j+1]+a[i][j]; else b[i][j]=b[i+1][j]+a[i][j]; } printf("%d\n",b[1][1]); }

int main(){ while(scanf("%d",&n)!=EOF&&n!=0){ data_set(); solve(); } return 0; }

地道战
Time Limit:1000MS Memory Limit:65536K Total Submit:412 Accepted:237

Description
大家一定看过地道战的电视吧。 话说小兵张嘎有一回也跑去支援地道战了。那是河北的一个小镇里,这 个小镇比较复杂,什么样的人都有。所以张嘎不能走大街,只能在地道 里走。但根据地质情况不同,所以同样长的街道,地道里要走的时间可 能不一样。当然每条街道下面都有地道,而且在街道连接处地道也有连 接。有一天张嘎在 A 处,突然发现有大部队的敌军前来,所以他必须以 尽快的速度跑到 B 处通知分队隐蔽,每条地道上都标出了他要走的时 间。请帮他算一下,怎么走时间最短。

A +---2---+---3---+----1---+----2---+

| 2 |

| 1 |

| 2 |

| 2 |

| 3 |

+---2---+---3---+----4---+---5----+ | 3 | | | 4 | | 1 | | 2 | | 3

+---2---+---2---+---1----+---4----+ | 2 | | | 2 | | 1 | | 3 | | 4

+---1---+---3---+---2----+---3----+ B

Input
有多个测试案例。 每个测试案例,第 1 行输入 2 个整数 N 和 M (1 <= n,m <=100)分别表 示横向的街道的条数和纵向街道的条数。 以下 n 行每行输入各段地道(横向)需要的时间,每行按从左到右的顺

序 一下 m 行每行输入各段地道(纵向)需要的时间,每列按从上到下的 顺序 处理到文件末尾

Output
对每个测试案例输出一行,输出他从 A 到 B 的最短时间

Sample Input
4 2 2 2 1 2 1 2 2 3 5 3 3 2 3 3 4 1 2 3

1 4 1 2 2 2 1 3 4

2 5 4 3

Sample Output
13

Hint
只能向下或向右 依次把每个点到第一个点的最小时间算出来, 最后就可以把最后那点的 时间求出,属于简单动态规划。

#include<stdio.h> #include<string.h> const int maxn=110; const int inf=200000000; int n,m,a[maxn][maxn],r[maxn][maxn],d[maxn][maxn]; int min(int a,int b){ return a<b?a:b; } void data_set(){ for(int i=1;i<=n;i++) for(int j=1;j<m;j++) scanf("%d",&r[i][j]); for(int i=1;i<=m;i++) for(int j=1;j<n;j++) scanf("%d",&d[j][i]); for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) a[i][j]=inf; } void solve(){ a[1][1]=0; for(int i=2;i<=m;i++)

a[1][i]=a[1][i-1]+r[1][i-1];

for(int i=2;i<=n;i++)

a[i][1]=a[i-1][1]+d[i-1][1];

for(int i=2;i<=n;i++){ for(int j=2;j<=m;j++){ a[i][j]=min(a[i][j-1]+r[i][j-1],a[i-1][j]+d[i-1][j]); } } printf("%d\n",a[n][m]); } int main() { while(scanf("%d%d",&n,&m)!=EOF){ data_set(); solve(); } }

Problem E: 深入浅出学算法 035-01 背包 问题
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 520 Solved: 295

Description
已知 n 种物品和一个可容纳 C 重量的背包, 物品 i 的重量为 wi,产生的效益为 pi, 在装包时物品 i 可以装入,也可以不装,但不可以拆开装。即物品 i 可产生的效益 为 xipi,这里 xi 为 0 或 1。请问如何装包,能使装包总效率最大。

Input
多组测试数据。每组第一行输入 2 个整数,分别为 C 和物品种数 n 然后是 n 行, 每行输入 2 个整数,分别是物品的重量 wi 和物品产生的效益 pi

Output
对于每组数据输出 1 行,包含 2 个数分别为装包的重量及产生的效益

Sample Input
60 6 15 32 17 37 20 46 12 26 9 21 14 30

Sample Output
60 134

HINT

Problem D: 深入浅出学算法 034-最长公 共子序列
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 382 Solved: 219

Description
一个给定序列的子序列是在该序列中删去若干项后所得到的序列。 用数学语言表述, 给定序列 X={x1,x2,...xm},另一序列 Z={z1,z2,...zk},X 的子序列是指存 在 一 个 严 格 递 增 下 标 序 列 {i1,i2,...,ik} 使 的 对 于 所 有 j=1,2,...,k 有 zj=xij. 若序列 Z 是序列 X 的子序列,又是序列 Y 的子序列,则称 Z 是序列 X 与 Y 的公共子序列。给定 2 个序列 X={x1,x2,...xm},Y={y1,y2,...,yn},找出 序列 X 和 Y 的最长公共子序列

Input
多组测试数据,第一行先输入 1 个整数 T 表示数据组数然后每组 2 行

Output
对于每组测试数据输出 1 行,先输出公共子序列的长度,然后输出一个空格,再输 出最长公共子序列

Sample Input
1 hsbafdreghsbacdba acdbegshbdrabsa

Sample Output
9 adeghbaba

Problem A: 深入浅出学算法 027-皇后问 题
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1819 Solved: 805

Description
在 n*n(1 <= n <= 8)的棋盘上放置 n 个皇后,使它们互不攻击,即任意两个皇 后不允许处在同一横排。同一纵列,也不允许处在同一与棋盘边框成 45o 角的斜线 上

Input
多组测试数据,每组输入一个整数 n

Output

对于每组测试数据输出 1 行,如果没有可能做到输出 No,否则在一行中输出所有皇 后的位置,输出时按第 1 列所在行数,第 2 列所在行数,...输出(行的起始坐标 为 1) ,如果有多种可能,只输出行数最小的那组(即第一列行数最小的,若第一列 行数最小的有多种情况,输出第二列行数最小的,依次类推)

Sample Input
3 4

Sample Output
No 2 4 1 3

HINT
对于第 2 组数据,

________________

|

|

| 1 |

|

|___|___|___|___|

| 2 |

|

|

|

|___|___|___|___|

|

|

|

| 3 |

|___|___|___|___|

|

| 4 |

|

|

|___|___|___|___|

#include <stdio.h> #include <math.h> #include <stdlib.h> int main() { int i,a[9],g,k,n,j; while(scanf("%d",&n)!=EOF) { i=1; a[i]=1; while(1) { g=1; for(k=i-1;k>=1;k--) { if(a[i]==a[k]||abs(a[i]-a[k])==i-k) { g=0; } } if(g&&i==n) { for(j=1;j<n;j++) { printf("%d ",a[j]); } printf("%d\n",a[j]); break; } if(i<n&&g) { i++; a[i]=1; continue; } while(a[i]==n&&i>1)

{ i--; } if(a[i]==n&&i==1) { printf("No\n"); break; } else { a[i]=a[i]+1; } } } return 0; }

Problem B: 深入浅出学算法 028-桥本分数 式
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1764 Solved: 826

Description
日本数学家桥本吉彦教授于 1993 年 10 月在我国山东举行的中日美三国数学教育研 讨会上向与会者提出了以下填数趣题:把 1 2 3 ... 9 这 9 个数字填入下式中的 9 个方格中,数字不的重复,使下面的分式成立。
□ □ □

----- + ----- = -----□□ □□ □□

桥本当即给出了一个解答

Input
没有输入

Output
输出桥本分数的解答数

Sample Input


Sample Output
#include<stdio.h> int main() { int g,i,k,s,a[10]; long m1,m2,m3 ; i=1;a[1]=1;s=0; while(1) { g=1; for(k=i-1;k>=1;k--) if(a[i]==a[k]) { g=0; break; } if(i==9&&g==1&&a[1]<a[4]) { m1=a[2]*10+a[3]; m2=a[5]*10+a[6]; m3=a[8]*10+a[9]; if(a[1]*m2*m3+a[4]*m1*m3==a[7]*m1*m2) { s++; } } if(i<9&&g==1)

{ i++; a[i]=1;continue; } while(a[i]==9&&i>1) i--; if(a[i]==9&&i==1) break; else a[i]++; } printf("%d\n",s); return 0; }

Problem C: 深入浅出学算法 029-素数和 环
Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1060 Solved: 541

Description
把前 n 个正整数摆成 1 个环,如果环中所有相邻的 2 个数之和都是 1 个素数,该环 称为 1 个 n 项素数和环。输入 1 个整数 n,输出共有多少种

Input
输入一个正整数 n

Output
输出环的个数,要求环的第一个数字是 1

Sample Input
4

Sample Output
2

HINT
#include<stdio.h> #include<math.h> int main() { int t,i,j,n,k,s,a[2000],b[1000]; while(scanf("%d",&n)!=EOF) { for(k=1;k<=2*n;k++) b[k]=0; for(k=3;k<2*n;k+=2) { for(t=0,j=3;j<=sqrt(k);j+=2) if(k%j==0) { t=1; break; } if(t==0) b[k]=1; } a[1]=1; s=0; i=2; a[i]=2; while(1) { t=1; for(j=1;j<i;j++) if(a[j]==a[i]||b[a[i]+a[i-1]]!=1) {

t=0; break; } if(t&&i==n&&b[a[n]+1]==1) { s++; } if(t&&i<n) { i++; a[i]=2; continue; } while(a[i]==n&&i>1) i--; if(i>1) a[i]++; else break; } printf("%d\n",s); } }

Problem D: 深入浅出学算法 030-德布鲁 金环
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 118 Solved: 71

Description
由 2n 个 0 或 1 组成的数环,形成 2n 个数字组成的二进制数恰在环序列中出现一次。 这个序列被称为 n 阶德布鲁金环

Input

输入一个整数 n

Output
输出由 n 个 0 开头的德布鲁金环的解的数目

Sample Input
2

Sample Output
1

HINT
#include <stdio.h> #include<math.h> int main() { int d,i,h,k,j,m,m1,m2,n,s,t,x,a[200]; while(scanf("%d",&n)!=EOF) { m=1; for(k=1;k<=n;k++) m=m*2; s=0; for(k=0;k<=n+m;k++) a[k]=0; a[n]=1; a[m-1]=1; i=n; while(1) { if(i==m-2) { for(h=0,j=n+1;j<=m-2;j++)

if(a[j]==0) h++; if(h==m/2-n) { for(t=0,k=0;k<=m-2;k++) for(j=k+1;j<=m-1;j++) { d=1; m1=0; m2=0; for(x=n-1;x>=0;x--) { m1=m1+a[k+x]*d; m2=m2+a[j+x]*d; d=d*2; } if(m1==m2) { t=1; break; } } if(t==0) { s++; } } } if(i<m-1) { i++; a[i]=0; continue; } while(a[i]==1&&i>n+1) i--; if(a[i]==1&&i==n+1) break; else a[i]=1; } printf("%d\n",s); } return 0; }

Problem E: 深入浅出学算法 031-装错信封
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 963 Solved: 586

Description
清明时节雨纷纷,写封信件祭先人。无奈信件实在多,错装信封把信混。现写了 n 封信和 n 个信封,把所有的信都装错信封的情况共有多少种?

Input
多组测试数据,每组输入 1 个整数 n (10 >= n >=2)

Output
对于每组测试数据输出一行,值为所有的信都装错信封的情况种数?

Sample Input
2

Sample Output
1

#include<stdio.h> int main() { int i,a[20],n; while(scanf("%d",&n)!=EOF) { for(i=2;i<=n;i++) { a[2]=1; a[3]=2; if(i>=4) a[i]=(i-1)*(a[i-2]+a[i-1]); } printf("%d\n",a[n]); } return 0; }

Problem F: 深入浅出学算法 032-装错信封
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 627 Solved: 425

Description
清明时节雨纷纷, 写封信件祭先人。 无奈信件实在多, 错装信封把信混。 现写 了 n 封信和 n 个信封,把所有的信都装错信封的情况共有多少种?

Input
多组测试数据,每组输入 1 个整数 n (10 >= n >=2)

Output
对于每组测试数据输出一行,值为所有的信都装错信封的情况假设信的编号为 1 2 ... n 信封的编号为 1 2 ...n 输出时按照信编号顺序输出对应装错的信封编 号,多种情况时按照信编号在前的信封编号由小到大顺序输出,每种情况输出在一 行如 n=3 时有 231 312 两种情况因 1 号信对应的信封有装错 2 和 3 两种情况, 先输出装错 2 的情况,故输出为 231 312 而不是 312 231

Sample Input
3

Sample Output
231 312

HINT
#include<stdio.h> int main() {

int n,i,k,g,q,j,a[11],s; while(scanf("%d",&n)!=EOF) { i=1;a[i]=2;s=0; while(1) { g=1; for(k=i;k>=1;k--) { if(a[k]==k) { g=0; break; } } for(j=1;j<=i;j++) { for(q=j+1;q<=i;q++) { if(a[j]==a[q]) { g=0; break; } } } if(i==n && g) { for(i=1;i<n;i++) { printf("%d",a[i]); } printf("%d\n",a[i]); } if(i<n && g) { i++; a[i]=1;

continue; } while(a[i]==n && i>1) { i--; } if(a[i]==n && i==1) { break; } else { a[i]++; } } } return 0; }

Problem E: Let the Balloon Rise
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2838 Solved: 1102

Description
Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges' favorite time is guessing the most popular problem. When the contest is over, they will count the balloons of each color and find the result. This year, they decide to leave this lovely job to you.

Input
Input contains multiple test cases. Each test case starts with a number N (0 < N <= 1000) -- the total number of balloons distributed. The next N lines contain one color each. The color of a balloon is a string of up to 15 lower-case letters. A test

case with N = 0 terminates the input and this test case is not to be processed.

Output
For each case, print the color of balloon for the most popular problem on a single line. It is guaranteed that there is a unique solution for each test case.

Sample Input
5 green red blue red red 3 pink orange pink 0

Sample Output
red pink

HINT
#include<stdio.h> #include<string.h> char a[1000][15]; int b[1000];

int main() { int n,i,j,max,k; while(scanf("%d",&n)!=EOF) { if(n==0) break; for(i=1;i<=n;i++) { } { { } } max=b[1]; k=1; for(i=2;i<=n;i++) { if(b[i]>max) { max=b[i]; k=i; } } printf("%s\n",a[k]); } return 0; } b[i]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) b[i]++; scanf("%s",a[i]); //二维数组的神奇用法

if(strcmp(a[i],a[j])==0)

Problem A: 深入浅出学算法 002-n 个 1
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2170 Solved: 737

Description

由 n 个 1 组成的整数能被 K(K<10000)整除,n 至少为多少?

Input
多组测试数据,第一行输入整数 T,表示组数 然后是 T 行,每行输入 1 个整数代表 K

Output
对于每组测试数据输出 1 行,值为 n

Sample Input
1 11

Sample Output
2

HINT

#include<stdio.h> int main() { int T,k,n,i,r,m,z; while(scanf("%d",&T)!=EOF) { for(i=1;i<=T;i++) { n=1; r=1; scanf("%d",&k); while(r!=0) { m=r*10+1;

r=m%k; n++; } printf("%d\n",n); } } }

杭电 acm 部分答案_百度文库 http://wenku.baidu.com/link?url=9VSmSRXM9e_S31C7GnIc17 OwzlfPfOfIoT-5pXSIgzG8ulI0ScXnobaEnMpcBjVN8B7hLClDbXVLlUefixO2oBtg6AOWIkrGRbensm z7en_

Problem A: 数字菱形
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 4241 Solved: 2642

Description
输出由数字组成的菱形图案

Input
输入一个正整数 n。

Output
输出由数字组成的菱形图案。其中,菱形图案当中一层的数字正好是输入的数字 n。

Sample Input
3

6

Sample Output
1 222 33333 222 1

1 222 33333 4444444 555555555 66666666666 555555555 4444444 33333 222 1

#include<stdio.h> int main() {int n,i,j,a,b; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(j=1;j<=2*i-1;j++)

printf("%d",i); printf("\n"); } for(a=1;a<n;a++) { for(b=1;b<=a;b++) printf(" "); for(b=1;b<=2*(n-a)-1;b++) printf("%d",n-a); printf("\n"); }} return 0; }

Problem B: 保卫钓鱼岛
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1736 Solved: 974

Description
钓鱼岛是中国不可分割的领土。当中日摩擦日益剧烈后,日本可能会攻击钓鱼岛。 当然他们攻击可能会采用导弹。中国的导弹技术比日本可高了。我们的雷达在获取 日本导弹后,可轻松拦截,当然有必要的情况,我们还可以进行强有力的反击。在 反击之前,你要想办法拦截所有导弹,为了拦截导弹,你需要根据他们发出的导弹, 在不同时刻发出拦截指令。现在有雷达获取的导弹信息,请根据导弹距离按从远到 近进行拦截。

Input
多组测试数据, 先输入一个整数 T 表示组数每组测试数据, 先输入一个整数 N( 2 <= N <= 100) 然后是 N 个整数,表示导弹的距离。

Output
对于每组测试数据,在一行输出,按照从高到低的顺序,2 个分数之间用一个空格 隔开,最后一个距离后没有空格

Sample Input

2 3 670 980 230 4 90 87 76 960

Sample Output
980 670 230 960 90 87 76

#include<stdio.h> int main() { int i,j,t,n,m; int a[101]; scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<=n;i++){ for(j=i;j<=n;j++){ if(a[j]>a[i]){ t=a[i]; a[i]=a[j]; a[j]=t; } else continue; }} for(i=1;i<=n;i++){ if(i!=n)

printf("%d ",a[i]); else printf("%d\n",a[i]); } } return 0; }

Problem D: 基因分裂
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2582 Solved: 1160

Description
转基因食物现在很火。当然是否安全也引起大家的争议。不过基因工程确也是大家 值得研究的问题,如果合理地处理好基因问题,对人类倒确实是一个很大的帮助。 假设现在有 1 个基因细胞,每 1 分钟初它能分裂出一个新的细胞,新产生的基因细 胞从第 4 分钟开始成熟,每分钟初也能 n 分裂出一个新的基因细胞。请编程求在第 n 分钟的时候,共有多少个基因细胞。

Input
输入数据由多个测试实例组成, 每个测试实例占一行, 包括一个整数 n(0 < n < 55), n 的含义如题目中描述。 n=0 表示输入数据的结束,不做处理。

Output
对于每个测试实例,输出在第 n 年的时候基因细胞的数量。每个输出占一行。

Sample Input
2 4 5 0

Sample Output

2 4 6

#include <stdio.h> int main() { int n,i; int a[55]={0}; while(scanf("%d",&n)!=EOF&&(n!=0)) { a[1]=1; a[2]=2; a[3]=3; a[4]=4; a[5]=6; for(i=5;i<=n;i++) a[i]=a[i-1]+a[i-3]; printf("%d\n",a[n]); } return 0; }

Problem E: 碉堡
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 476 Solved: 294

Description
在方形的城市里有一些笔直的街道,下图所示的地图就是 n 行 m 列的城市地图,街道 上可能是空的也可能是一堵墙.为了保护城市,在其中的一些空地上可以建设碉堡, 碉堡可以朝东南西北四个方向发射子弹.但现在的枪很厉害,能够穿透碉堡,而墙能

防止子弹穿透.现在给你一个地图,你最多能放几个碉堡,使所有碉堡不会互相攻 击. 下图是个示例供你参考.

Input
多组测试数据.每组测试数据先输入一个整数 n (n <= 4) 表示方形城市的尺寸, 如果输入 0 就结束. 然后是一个 n 行 n 列的地图,其中.表示空地,X 表示墙

Output
对于每组测试数据请输出最多可以放多少个碉堡而不会互相攻击.

Sample Input
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3

... .XX .XX 4 .... .... .... .... 0

Sample Output
5 1 5 2 4

Problem C: 最大盈利
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1727 Solved: 487

Description
徐老师前一段时间也在股市里玩了一把,而她是很细心的人,将每一天的盈亏的情 况都按顺序记在本子上了, 分别是 a[1],a[2],...a[n]. 现在你的任务是帮她计 算一下, 从哪一天到哪一天这段时间里她的盈利是最多的。 比如, (6,-1,5,4,-7), 她盈利最多的是 6 + (-1) + 5 + 4 = 14.

Input
第一行输入一个整数 T, 表示她有 T 本账本(最多不超过 20) , 对于每一本账本, 都 有一行数据。每行数据第一个数字是一个整数 N ( 1 <= N <= 100000 ), 然后 是 N 个整数(-500 到 500 之间) 。

Output
对于每本账本,你要输出 2 行,第一行是:"Payoff #:", #是账本号. 第 2 行 包含三个数,最大盈利、该最大盈利起始编号与终止编号。如果有很多这样的结果, 只输出第一个出现的最大盈利的情况。在 2 个账本之间要输出一个空行。

Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5

Sample Output
Payoff 1: 14 1 4

Payoff 2: 7 1 6

Problem B: 绝配队伍
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 7847 Solved: 4236

Description
经过了 ACM 集训选拔后,不少同学参加了暑假集训。暑假集训后,老师为大家组队 (三个人一组),组队时我们一般遵守下面的原则: (1)尽量自愿。 (2)尽量互补。即专业跨度大一些,知识点掌握程度尽量不一样 为了增加趣味性,老师让同学各自报一个数字,然后三人自愿组合成一个队,并将 3 人组合成的数报上来,如果这 3 人组成的数是水仙花数,我们认为这就是绝配队 伍。 水仙花数是指一个 3 位数,它的每个位上的数字的 3 次幂之和等于它本身。(例 如:1^3 + 5^3+ 3^3 = 153)

Input
多组测试数据,每组输入一个 3 位整数

Output
每组输出一行,如果是水仙花数则输出"Yes“,否则输出"No"

Sample Input
153 610

Sample Output

Yes No

HINT
注意:计算某个数 n 的 3 次方,不要用 pow(n,3),而应该为:n * n * n。原 因 pow 的参数是 double 型,会有精度问题。

#include<stdio.h> int main() { int n,a,b,c; while(scanf("%d",&n)!=EOF) { a=n/100; b=n/10%10; c=n%10; if(a*a*a+b*b*b+c*c*c==n) printf("Yes\n"); else printf("No\n"); } }

Problem D: 超级楼梯
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 353 Solved: 287

Description
有一楼梯共 M 级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第 M 级,共有多少种走法?

Input
输入数据首先包含一个整数 N,表示测试实例的个数,然后是 N 行数据,每行包含 一个整数 M(1<=M<=40),表示楼梯的级数。

Output
对于每个测试实例,请输出不同走法的数量

Sample Input
2 2 3

Sample Output
1 2

#include<stdio.h> int main() { int n,m,i,j,a[10000]; scanf("%d",&n); { for(i=1;i<=n;i++) { scanf("%d",&m); a[1]=1; a[2]=2; for(j=3;j<=m-1;j++) a[j]=a[j-1]+a[j-2]; printf("%d\n",a[m-1]); } } }

Problem C: 幸运日
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 828 Solved: 127

Description
6 是 1 个神奇的数字。 小明认为以这个月 1 日开始计算,距离基础日天数是 6、含有 6 或是 6 的倍数的日 子都是幸运日,比如本月 6 号,12 日等都是。不过这个幸运日只能持续 200 天, 200 天后的基数日要重新选择。现在告诉你今天是几号,你能帮小明找出剩下的所 有幸运日吗?你只需列出距离基础日(即本月 1 日)的天数即可。

Input
多组测试数据,先输入整数 T 表示组数,每组测试数据输入一个 10 以下的正整数,

Output
对于每组测试数据,输出在一行,要求输出所有的幸运日

Sample Input
1 3

Sample Output
6 12 16 18 24 26 30 36...

HINT
输出时每个数字后有一个空格

#include<stdio.h> int main() {

int n,m,i,j; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&m); if(m>6) { for(j=m;j<=200;j++) if(j%6==0||j%10==6||j/10==6) printf("%d ",j); printf("\n"); } if(m<=6) { for(j=m;j<=200;j++) if(j%6==0||j%10==6||j/10==6) printf("%d ",j); printf("\n"); } } return 0; }


更多相关文档:

算法标准答案

算法标准答案_其它课程_高中教育_教育专区。Problem H: 乘法口诀 Time Limit: ...('\n'); } return 0; } Problem A: 零起点学算法 87——打印所 有低于...

算法经典例题及答案

算法经典例题及答案_数学_高中教育_教育专区。算法专题训练 1、设计一个程序框图,使之能判断任意输入的整数 x 是奇数还是偶数. [解析] 程序框图如下. 2、 已知...

算法 第四版 习题 答案

算法 第四版 习题 答案_理学_高等教育_教育专区。算法 第四版 习题 答案 ...(N-1); else return 0; } 1.1.21 编写一段程序,从标准输入按行读取数据...

算法题目及答案

算法题目及答案_理学_高等教育_教育专区。1. 根据两个有序单链表生成一个新的有序单链表, 原有单链表保持不变。 要求新生成的链表中 不允许有重复元素。 算法...

算法分析复习题目及答案

算法分析复习题目及答案_工学_高等教育_教育专区。一、选择题 1、二分搜索算法...B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是( C )。...

最优化算法课后习题标准版(第三章)

(清华大学)陈宝林最优化算法第三章标准答案 第三章—单纯形方法题解 1 (清华大学)陈宝林最优化算法第三章标准答案 2 (清华大学)陈宝林最优化算法第三章标准答案...

陈宝林最优化课后习题标准答案(第一章)

陈宝林最优化课后习题标准答案(第一章)_理学_高等教育_教育专区。清华大学研究生公共课教材·数学系列,最优化理论与算法习题解答的电子版详细解答哦。...

JAVA算法编程题全集(50题及答案)

JAVA算法编程题全集(50题及答案)_英语考试_外语学习_教育专区。经典算法值得你学习。程序 1。题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔...

算法考试试题及答案

算法考试试题及答案_工学_高等教育_教育专区。算法考试试题及答案 一、填空题(本题 10 分,每空 1 分) 1、 算法的复杂性是 程序段的时间复杂度为 i=1; k...

算法设计与分析考试题及答案

算法设计与分析考试题及答案_理学_高等教育_教育专区。觉得蛮好 ...___和___之分, 衡量一个算法 好坏的标准是___。 3. 某一问题可用动态规划...
更多相关标签:
算法导论第三版答案 | 算法导论答案 | gpa标准加权算法 | 算法第四版答案 | 标准加权算法 | java算法面试题及答案 | 最优化理论与算法答案 | ios算法面试题及答案 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com