zoukankan      html  css  js  c++  java
  • 18.06.25 16年期末01-05集合

    B01:篮球联赛

    描述

    校篮球队每年都会举办“年级联赛”。篮球队的队员们将根据年级分为一年级、二年级、三年级和四年级4支队伍,参与角逐。

    在年级联赛中,不同队伍两两之间比赛一场,胜者积1分,负者积0分(篮球比赛无平局)。最终队伍将按照积分从高到低排名,若出现同分,则年级较低的排名靠前。

    现在年级联赛正在进行中,有些比赛已经结束,有些比赛则因种种原因还未进行。请你根据当前的比赛情况,计算出一年级队在联赛结束后,有可能得到的最高名次。

    输入输入包含多组数据。第一行是一个整数T(1 <= T <= 100),表示数据组数。

    对于每组数据,用一个4*4的字符矩阵表示当前的比赛情况。第i行第j列表示i年级与j年级的比赛情况,其中:
    “-”表示i与j相同,无比赛
    “W”表示i年级胜j年级
    “L”表示i年级负j年级
    “?”表示i年级和j年级的比赛还未进行

    输入

    数据保证正确不存在矛盾,且无多余空格或空行。

    输出

    对于每组数据,输出一个整数,即一年级队在联赛结束后,有可能获得的最高名次。

    样例输入

    2
    -LL?
    W-L?
    WW-L
    ??W-
    -WL?
    L-?L
    W?-L
    ?WW-
    

    样例输出

    3
    1
     1 #include <cstdio>
     2 #include <string>
     3 #include <memory>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 using namespace std;
     9 
    10 int main()
    11 {
    12     int t;
    13     scanf("%d", &t);
    14     while (t--) {
    15         char info[5][5];
    16         int point[5] = { 0 };
    17         for (int i = 1; i <= 4; i++)
    18             for (int j = 1; j <= 4; j++)
    19             {
    20                 cin >> info[i][j];
    21                 if (j > i)
    22                 {
    23                     if (info[i][j] == 'W')
    24                         point[i]++;
    25                     else if (info[i][j] == 'L')
    26                         point[j]++;
    27                 }
    28             }
    29         int notdefined[4][3],h=1;
    30         for(int i=1;i<=3;i++)
    31             for(int j=i+1;j<=4;j++)
    32                 if (info[i][j] == '?') {
    33                     if (i == 1)
    34                         point[1]++;
    35                     else if (point[i] > point[1])
    36                         point[i]++;
    37                     else if (point[j] > point[1])
    38                         point[j]++;
    39                     else
    40                         notdefined[h][0] = i,notdefined[h][1]=j,notdefined[h++][2]=0;
    41                 }
    42         int _point[5], ans = 4;
    43         for (int i = 1; i <=1<<(h-1); i++) {
    44             int tmp = 1;
    45             notdefined[1][2]++;
    46             while (notdefined[tmp][2] > 1) {
    47                 notdefined[tmp][2] = 0;
    48                 tmp++;
    49                 notdefined[tmp][2]++;
    50             }
    51             for (int j = 1; j <= 4; j++)
    52                 _point[j] = point[j];
    53             for (int j = 1; j <= h - 1; j++) {
    54                 if (notdefined[j][2] == 1)
    55                     _point[notdefined[j][0]]++;
    56                 else
    57                     _point[notdefined[j][1]]++;
    58             }
    59             int _ans = 1;
    60             for (int i = 2; i <= 4; i++)
    61                 if (_point[i] > _point[1])
    62                     _ans++;
    63             ans = min(_ans, ans);
    64         }
    65         printf("%d
    ", ans);
    66     }
    67     return 0;
    68 }
    View Code

    实现得不怎么样,除了这种笨拙的枚举以外想不到还有什么方法了

    B02:夺宝探险

    描述

    你无意中发现了装满了宝藏的迷宫,你想要获得尽可能多的宝藏,但是迷宫里的机关阻碍了你的计划。迷宫的地面是M行N列的矩形网格,每格是一块带有机关且放置了1个宝藏的地砖,宝藏一共有K种,用1-K表示其种类,迷宫的入口只有一个,为迷宫的第一行第一列。地砖的机关如下:

    1. 每次你只能踏到你与你所在地砖相邻的地砖上(即前后左右4块);

    2. 当你踏上某块地砖后,其上的宝藏(假设种类为k)自动归属你,同时所有放置了种类为k的宝藏的地砖碎裂,你无法踏上,你当前所在的地砖在你离开后也会立刻碎裂;

    3. 当你无路可走的时候,你会被传送回迷宫出口,无法再进入迷宫。

    你想知道你最多能获得多少宝藏。

    输入

    输入的第一行是三个用空格隔开的整数,分别是M、N和K(1 <= M,N <= 20, 1 <= K <= 100)
    之后是M行,每行包含N个范围为1-K的整数,用空格隔开,表示放置的宝藏种类

    输出

    只有一行,为一个整数,表示最多能获得的宝藏个数。

    样例输入

    3 4 5
    1 2 3 3
    2 1 4 3
    1 5 1 2

    样例输出

    4
     1 #include <cstdio>
     2 #include <string>
     3 #include <memory>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 #include<queue>
     9 using namespace std;
    10 
    11 int m, n, k,ans;
    12 int map[25][25];
    13 int dir1[4] = { 0,0,1,-1 }, dir2[4] = { 1,-1,0,0 };
    14 
    15 struct node {
    16     int x, y;
    17     bool visited[105];
    18     int kind;
    19     node(int _x, int _y) {
    20         x = _x,y=_y;
    21         kind = 0;
    22     }
    23 };
    24 queue<node> all;
    25 
    26 void bfs() {
    27     while (!all.empty()) {
    28         node now = all.front();
    29         all.pop();
    30         for (int i = 0; i < 4; i++) {
    31             int xx = now.x + dir1[i], yy = now.y + dir2[i];
    32             if (map[xx][yy] < 1 || now.visited[map[xx][yy]] == 1)
    33                 continue;
    34             node newone(now);
    35             newone.x = xx, newone.y = yy;
    36             newone.visited[map[xx][yy]] = 1;
    37             newone.kind++;
    38             ans = max(ans, newone.kind);
    39             all.push(newone);
    40         }
    41     }
    42 }
    43 
    44 int main()
    45 {
    46     scanf("%d%d%d", &m, &n, &k);
    47     for (int i = 1; i <= m; i++)
    48         for (int j = 1; j <= n; j++)
    49             scanf("%d", &map[i][j]);
    50     node origin(1, 1);
    51     origin.kind = 1;
    52     for (int i = 1; i <= k; i++)
    53         origin.visited[i] = false;
    54     origin.visited[map[1][1]] = 1;
    55     all.push(origin);
    56     bfs();
    57     printf("%d
    ", ans);
    58     return 0;
    59 }
    View Code

    用广搜似乎有点慢

    深搜不知道怎样 我永远都判断不了深搜的速度到底有多慢……

    B03:寻找边缘

    描述

    给定一张 R*C 的地图,由 "X" 和 "O" 组成。

    现在需要重新处理这张地图,找到地图边缘的那些 "O"。你需要将这些地图边缘上的 "O" 保留下来,然后将其他的 "O" 全部替换为 "X"。

    地图边缘的 "O" 指的是那些处于第一行/列或最后一行/列上的 "O",以及从这些 "O" 的相邻位置(上下左右)延伸出去的 "O"。

    输入

    第一行是一个正整数 T,表示一共有 T 组数据。
    对于每组数据,其第一行是两个正整数 R 和 C,表示地图的大小,用一个空格分开。
    接下来的 R 行,每行包含了 C 个字符,分别是 "X" 或 "O"。
    其中,0 < T <= 10,0 < R, C <= 500。

    输出

    对于每组数据,输出 R 行,每行包含了 C 个字符,分别是 "X" 或 "O"。
    每组数据之间需要额外输出一个空行。

    样例输入

    2
    2 3
    OXX
    XXO
    5 5
    XXXOX
    XXXOX
    XOOXX
    XXOXX
    XOXXX

    样例输出

    OXX
    XXO
    
    XXXOX
    XXXOX
    XXXXX
    XXXXX
    XOXXX
     1 #include <cstdio>
     2 #include <string>
     3 #include <memory.h>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 #include<queue>
     9 using namespace std;
    10 
    11 int map[505][505];
    12 int r, c;
    13 int dir1[4] = { 0,0,1,-1 }, dir2[4] = { 1,-1,0,0 };
    14 int kept[505][505];
    15 
    16 void dfs(int x, int y) {
    17     kept[x][y] = 1;
    18     for (int i = 0; i < 4; i++) {
    19         int xx = x + dir1[i], yy = y + dir2[i];
    20         if (kept[xx][yy] != 1 && map[xx][yy] == 1)
    21             dfs(xx, yy);
    22     }
    23 }
    24 
    25 int main()
    26 {
    27     int t;
    28     scanf("%d", &t);
    29     while (t--) {
    30         memset(kept, 0, sizeof(int) * 505 * 505);
    31         memset(map, 0, sizeof(int) * 505 * 505);
    32         scanf("%d%d", &r, &c);
    33         char ch;
    34         for(int i=1;i<=r;i++)
    35             for (int j = 1; j <= c; j++) {
    36                 cin >> ch;
    37                 if (ch == 'O')
    38                     map[i][j] = 1;
    39                 else
    40                     map[i][j] = 2;
    41             }
    42         for (int i = 1; i <= r; i++) {
    43             if(map[i][1]==1&&kept[i][1]==0)
    44                 dfs(i, 1);
    45             if (map[i][c] == 1 && kept[i][c] == 0)
    46                 dfs(i, c);
    47         }
    48         for (int i = 1; i <= c; i++) {
    49             if (map[1][i] == 1 && kept[1][i] == 0)
    50                 dfs(1, i);
    51             if (map[r][i] == 1 && kept[r][i] == 0)
    52                 dfs(r, i);
    53         }
    54         for (int i = 1; i <= r; i++)
    55         {
    56             for (int j = 1; j <= c; j++) {
    57                 if (map[i][j] == 2)
    58                     printf("X");
    59                 else if (kept[i][j])
    60                     printf("O");
    61                 else
    62                     printf("X");
    63 
    64             }
    65             printf("
    ");
    66         }
    67             printf("
    ");
    68     }
    69     return 0;
    70 }
    View Code

    最后一行是有换行符的

    深搜

    B04:猴子摘桃

    描述

    一只猴子正在赶路,发现了一排桃树。它想去摘桃子,但桃树上可能有马蜂。幸好它带着一罐蜂蜜。每次它接近一个桃树时,只要给树上的每只马蜂一克蜂蜜,就可以放心经过和摘桃,不用担心了被蜇,否则就过不了这棵树且会蜇。幸运的是,猴子可以直接跳到任意一颗桃树开始采摘,然后就只能沿着桃树所在的直线单向走且不可跳过桃树,一旦离开桃树所在的直线就不能再回去。请问被马蜂蜇之前,猴子最多可以摘到多少桃子。

    输入

    包含多个案例。每个案例的第一行是一个正整数,表示猴子所带蜂蜜的重量,单位为克,接着若干行,每行两个整数,分别表示一颗桃树上的桃子数量和马蜂数量,每个案例的最后一行是两个-1。排在前面的桃树先输入。输入的最后一行是-1。(桃树的数量最大为100)

    输出

    每个案例输出一个整数,表示猴子被马蜂蛰之前可以摘到的最大桃子数。

    样例输入

    50
    30 25
    24 8
    45 17
    38 20
    27 8
    18 5
    10 20
    -1 -1
    -1

    样例输出

    128

    提示输入数据确保输入数据和计算结果均可表示为4字节的整数。

     1 #include <cstdio>
     2 #include <string>
     3 #include <memory.h>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 #include<queue>
     9 using namespace std;
    10 
    11 int info[105][2];
    12 int hon,sum,ans;
    13 
    14 int main()
    15 {
    16     while (cin >> hon)
    17     {
    18         if (hon == -1)break;
    19         sum = 0, ans = 0;
    20         int p = 1;
    21         while (1) {
    22             scanf("%d%d", &info[p][0], &info[p][1]);
    23             if (info[p][0] == -1)break;
    24             sum++;
    25             p++;
    26         }
    27         for (int i = 1; i <= sum; i++) {
    28             int _hon = hon, peach = 0;
    29             for (int j = i; j <= sum; j++) {
    30                 _hon -= info[j][1];
    31                 if (_hon < 0)
    32                     break;
    33                 peach += info[j][0];
    34             }
    35             ans = max(ans, peach);
    36         }
    37         printf("%d
    ", ans);
    38     }
    39     return 0;
    40 }
    View Code

    B05:分形盒

    描述

    分形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。它跟分数维、自组织、非线性系统和混沌等具有非常重要的联系。

    分形盒就是这样一种分形,它的定义如下:

    维度是1的分形盒:

    X

    维度是2的分形盒:

    X  X

      X

    X  X

    如果已知维度是(n-1)的分形盒,那么维度是n的分形盒的递归定义如下所示:

    Box(n-1)               Box(n-1)

                  Box(n-1)

    Box(n-1)               Box(n-1)  

    你的任务是画一个维度为n的分形盒。

    输入

    输入包含多组测试数据。每一行包含一个正整数n表示分形盒的维度,n不大于7;最后一行是一个-1,表示输入结束。

    输出

    对于每组测试数据,输出要求维度的分形盒,注意X为大写字母。每组测试数据之后包含一行,改行只包含一个破折号。

    样例输入

    1
    2
    3
    4
    -1
    

    样例输出

    X
    -
    X X
     X
    X X
    -
    X X   X X
     X     X
    X X   X X
       X X
        X
       X X
    X X   X X
     X     X
    X X   X X
    -
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
       X X               X X
        X                 X
       X X               X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
             X X   X X
              X     X
             X X   X X
                X X
                 X
                X X
             X X   X X
              X     X
             X X   X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
       X X               X X
        X                 X
       X X               X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
    -
     1 #include <cstdio>
     2 #include <string>
     3 #include <memory.h>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 #include<queue>
     9 using namespace std;
    10 
    11 int pic[1000][1000];
    12 
    13 void draw(int x, int y, int dimension) {
    14     if (dimension == 1)
    15     {
    16         pic[x][y] = 1;
    17         return;
    18     }
    19     int epson = pow(3, dimension - 2);
    20     draw(x, y, dimension - 1);
    21     draw(x + epson, y + epson, dimension - 1);
    22     draw(x + 2 * epson, y, dimension - 1);
    23     draw(x, y + 2 * epson, dimension - 1);
    24     draw(x + 2 * epson, y + 2 * epson, dimension - 1);
    25 }
    26 
    27 int main()
    28 {
    29     int t;
    30     while (1) {
    31         memset(pic, 0, sizeof(int) * 1000 * 1000);
    32         scanf("%d", &t);
    33         if (t == -1)
    34             break;
    35         draw(1, 1, t);
    36         int dim = pow(3, t-1);
    37         for (int i = 1; i <= dim; i++)
    38         {
    39             for (int j = 1; j <= dim; j++) {
    40                 if (pic[i][j])
    41                     printf("X");
    42                 else
    43                     printf(" ");
    44             }
    45             printf("
    ");
    46         }
    47         printf("-
    ");
    48     }
    49     return 0;
    50 }
    View Code

    复健中……好久没有编代码了……

    之后的三天要沉浸在代码中惹

    以上是16年的水题归类……

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    论学究式教育
    Oracle中rownum与order by的执行顺序
    无效存储过程问题解决
    解决SGA_MAX_SIZE 的大小比 MEMORY_TARGET 大导致数据无法启动的错误
    ORACLE 按时间创建分区表
    Timage Canvas画图
    Oracle存储过程的加密
    Win32对话框模板创建的窗口上响应键消息,Tab焦点切换消息,加速键消息
    win32 TreeCtrl控件通知消息, LVN_SELCHANGED和LVN_ITEMCHANGED用法
    win32 对话框模板添加加速键
  • 原文地址:https://www.cnblogs.com/yalphait/p/9224645.html
Copyright © 2011-2022 走看看