2012级计科《程序设计基础Ⅱ》期末上机考试
上升子序列
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
一个只包含非负整数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列{a1, a2, ...,aN},我们可以得到一些上升的子序列{ai1, ai2, ..., aiK},这里1 ≤ i1 < i2 <...< iK ≤ N。例如:对于序列{1, 7, 3, 5, 9, 4, 8},有它的一些上升子序列,如{1, 7}, {3, 4, 8}等等。这些子序列中序列和最大的是子序列{1, 3, 5, 9},它的所有元素的和为18。 对于给定的一个序列,求出它的最大上升子序列的和。
注意:最长的上升子序列的和不一定是最大的哦。
输入
输入包含多组测试数据,对于每组测试数据:
输入数据的第一行为序列的长度 n(1 ≤ n ≤ 1000),
第二行为n个非负整数 b1,b2,...,bn(0 ≤ bi ≤ 1000)。
输出
对于每组测试数据,输出其最大上升子序列的和。
示例输入
7 1 7 3 5 9 4 8
示例输出
18
1 #include<stdio.h> 2 int main() 3 { 4 int n,a[1001],m,maxlen[1001]; 5 while(~scanf("%d",&n)) 6 { 7 for(int i = 0; i < n; i++) 8 scanf("%d",&a[i]); 9 maxlen[0] = a[0]; 10 for(int i = 1; i < n; i++) 11 { 12 m =0; 13 for(int j = 0; j < i; j++) 14 { 15 if(a[j] < a[i] && maxlen[j] > m) 16 m = maxlen[j]; 17 } 18 maxlen[i] = m + a[i]; 19 } 20 int maxx = -999; 21 for(int i = 0; i < n; i++) 22 if(maxx < maxlen[i]) 23 maxx = maxlen[i]; 24 printf("%d\n",maxx); 25 } 26 return 0; 27 } 28
类似于课本上的最长上升子序列
回文时间
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
HH 每天都会熬夜写代码,然后很晚才睡觉,但是每天早晨六点多必须要刷卡出宿舍,这就导致了必须在某些课上睡一会才能保证充沛的体力,当然某些重要的课是不能睡掉的,而某些课是可以睡的,比如《中国传统文化》,但是睡觉是不能被老师发现的,否则......他会以让你重修两年来威胁你。已知老师会在电子表上显示的时间为回文(例如:15:51)的时候来检查有没有人在睡觉,所以必须要在那个时间之前醒来。现在,给出 HH 开始睡觉的时间,你要帮她计算出下一个回文时间。
输入
输入包含多组测试数据,对于每组测试数据:
输入只有一行为一个字符串,字符串格式为"HH:MM",HH 和 MM 都为两位数字(00 ≤ HH ≤ 23, 00 ≤ MM ≤ 59)。
输出
对于每组测试数据,输出只有一行为下一个回文时间。
示例输入
12:21 23:59
示例输出
13:31 00:00
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s[10]; 6 int a,b,c,d; 7 while(scanf("%s",s)!=EOF) 8 { 9 a = (s[0]-'0')*10+(s[1]-'0'); 10 b = (s[1]-'0')*10+(s[0]-'0'); 11 c = (s[3]-'0')*10+(s[4]-'0'); 12 if(!((a>=6&&a<=9)||(a>=16&&a<=19))) 13 { 14 if(b > c) 15 { 16 printf("%02d:%02d\n",a,b); 17 continue; 18 } 19 else 20 { 21 if(a == 23) 22 { 23 printf("00:00\n");continue; 24 } 25 else 26 { 27 d = a+1; 28 if(d>=16&&d<=19) 29 {printf("20:02\n");continue;} 30 else if(d>=6&&d<=9){printf("10:01\n");continue;} 31 else{ printf("%02d:%02d\n",d,(d%10)*10+(d/10));continue;} 32 } 33 } 34 } 35 else if(a>=16&&a<=19) 36 { 37 printf("20:02\n"); 38 continue; 39 } 40 else 41 { 42 printf("10:01\n"); 43 continue; 44 } 45 } 46 return 0; 47 }
话说这个要考虑到特殊情况比如06点、16点或23点时,开始用gets输入一直output limit,改成scanf 才过。
递归的函数
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起来简单的一个函数?你能做对吗?
输入
输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。
输出
对于每组测试数据,输出函数的计算结果。
示例输入
1 1 1 2 2 2
示例输出
2 4
1 #include<stdio.h> 2 int main() 3 { 4 int f[21][21][21],i,j,k; 5 for( i = 0; i <= 20; i++) 6 for( j = 0; j <= 20; j++) 7 for( k = 0; k <= 20; k++) 8 { 9 if(i == 0 || j == 0 || k == 0) 10 f[i][j][k] = 1; 11 else if(i < j && j < k) 12 f[i][j][k] = f[i][j][k-1]+f[i][j-1][k-1]-f[i][j-1][k]; 13 else f[i][j][k] = f[i-1][j][k]+f[i-1][j-1][k]+f[i-1][j][k-1]-f[i-1][j-1][k-1]; 14 } 15 int a,b,c; 16 while(~scanf("%d %d %d",&a,&b,&c)) 17 { 18 if(a <= 0 || b <= 0 || c <= 0) 19 printf("%d\n",f[0][0][0]); 20 else if(a > 20 || b > 20 || c > 20) 21 printf("%d\n",f[20][20][20]); 22 else 23 printf("%d\n",f[a][b][c]); 24 } 25 return 0; 26 }
递归调用超时,直接用数组保存。