zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    2019 SDN上机第2次作业
    2019 SDN上机第1次作业
    第07组 团队Git现场编程实战
    第二次结对编程作业
    c语言之问题集
    2019春第2次课程设计实验安排
    2019年十二周总结
    第十一周总结
    第十周作业
    第九周总结
  • 原文地址:https://www.cnblogs.com/LK1994/p/3109556.html
Copyright © 2011-2022 走看看