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 }

递归调用超时,直接用数组保存。

posted on 2013-05-31 01:51  straw_berry  阅读(301)  评论(0编辑  收藏  举报