第十二届蓝桥杯校内模拟赛第二期惨痛经历

第十二届蓝桥杯校内模拟赛第二期惨痛经历

看清题意!不要想当然!

错了两道填空直接爆炸orz

第三题

问题描述
 请问有多少个序列满足下面的条件:

  1. 序列的长度为 5。
  2. 序列中的每个数都是 1 到 10 之间的整数。
  3. 序列中后面的数大于等于前面的数。

当时想成一个长度为5的字符串,单个字符就是1~9,看到“1 到 10 之间的整数”时强行开闭区间orz

题解

答案:2002

#include<iostream>
using namespace std;
int main()
{
    
    
    int sum=0;
    for(int i=1;i<=10;++i)
        for(int j=i;j<=10;++j)
            for(int k=j;k<=10;++k)
                for(int p=k;p<=10;++p)
                    for(int t=p;t<=10;++t)
                        ++sum;
    cout<<sum<<endl;
    return 0;
}

第四题

问题描述
  一个无向图包含 2020 条边,如果图中没有自环和重边,请问最少包含多少个结点?
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

题解

答案 :65

做题时太紧张,以为多个点不能形成环。要让结点最少会想到完全图,在没有自环和重边时结点形成的完全图边数最多。顶点个数为n的完全图边数为 n*(n-1)/2,代入此题算出最少包含65个结点时,可以达到2020条边。

第十题

问题描述
  小蓝在一个 n 行 m 列的方格图中玩一个游戏。
  开始时,小蓝站在方格图的左上角,即第 1 行第 1 列。
  小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过3。
  例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 5 行第 6 列、第 6 行第 5 列之一。
  小蓝最终要走到第 n 行第 m 列。
  在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。
  小蓝希望,从第 1 行第 1 列走到第 n 行第 m 列后,总的权值和最大。请问最大是多少?
输入格式
  输入的第一行包含两个整数 n, m,表示图的大小。
  接下来 n 行,每行 m 个整数,表示方格图中每个点的权值。
输出格式
  输出一个整数,表示最大权值和。
样例输入

3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4

样例输出

15

数据规模和约定
  对于30%的评测用例,1 <= n, m <= 10;
  对于50%的评测用例,1 <= n, m <= 20;
  对于所有评测用例,1 <= n <= 100,-10000 <= 权值 <= 10000。

题解
这道题需要把dp数组初始化为无穷小,因为题目有可能出现全为负值的情况,然后把dp[1][1]初始化为第1行第1列的值,这是起点。一个位置可以到达9个位置,就是说一个位置可以由9个位置转移而来,这个位置的值即可以转移而来的位置各自的值里加上本身的值的最大值。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int dir[9][2]={
    
    {
    
    0,-1},{
    
    0,-2},{
    
    0,-3},{
    
    -1,0},{
    
    -1,-1},{
    
    -1,-2},{
    
    -2,0},{
    
    -2,-1},{
    
    -3,0}};
const int N=110;
int map[N][N],dp[N][N];

int main()
{
    
    
    int n,m;
    scanf("%d%d",&n,&m);
    memset(dp,-0x3f,sizeof dp);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            scanf("%d",&map[i][j]);
    dp[1][1]=map[1][1];
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            for(int k=0;k<9;++k)
            {
    
    
                int x=i+dir[k][0];
                int y=j+dir[k][1];
                if(x>=1&&x<=n&&y>=1&&y<=m)
                    dp[i][j]=max(dp[i][j],dp[x][y]+map[i][j]);
            }
    printf("%d\n",dp[n][m]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_47156379/article/details/113120744