第五届蓝桥杯C++本科A组

今天上午参加了第五届蓝桥杯比赛,还是去年的地方,还是去年的考场,不同的是经过了一年的历练,多了一份坦然与自信。不管最后结果如何,是对自己一年学习的一个小小的交代。ACMER IN HHUC, we never say no.

结果填空

1.

a*a+b*b+c*c=1000;a,b,c均为整数,求一组解中的最小值。暴力的题目,很容易就想到了0,10,30.所以没多想就填上了0,可是考完发现还可以是负数。。。悲了个剧了,三分就这么水没了。。

2.

类似于往年的一道高斯的生日,求距离某一天(yyyy-mm-dd)X天是几月几日。因为数据比较小1000,编程反倒麻烦,所以手算了。答案应该是2017-08-05;

3.

说有一个神奇的数字,他的平方与立方各位数字不同而且能把0~9十个数全部用完。求这个数!每年都有这种考察对数的每一位操作的,关键还是暴力+每一位数字提取判断;但是刚上来应该要想到i*i+i*i*i 能表示十位,i是个两位数,从10到100里面找。答案好象是69;

代码填空

4.

输出一个图形。大致是将一个字符串嵌套到一个框框的正中间。

关键代码是:printf(“%*s%s%*s”); ________________;//输出最中间的一行

关键在于考得知识点很偏,%*s之前没有接触到过,知道表示的是将前面的空格填满,但是不知道该怎么表示。回来查过之后才知道用法类似于空格占位。所以正确代码应该是:

printf("%*s%s%*s",(width-2-strlen(buf))/2," ",buf,width-2-(width-2-strlen(buf))/2," ");

5.

1~9排列组合,一些做分子,一些做分母。求能组成的表示为1/3的组合。题目是用递归来做的,递归求排列枚举得出。

关键代码:

    {t=x[k];x[k]=x[i];x[i]=t};//完成一次交换

结果填空

6.

原题是发扑克,抽象出来就是1~13各最多有四张,任意挑13张,问最多有几种组合。最开始听学长说做蓝桥杯只要会深搜就可以了。果然是这样,以后好几道题思路也是一致的。深搜遍历,找到所有可能的情况,保证不重复只要保证后一个数大于等于前一个数就可以了。答案是:3598180

#include <iostream>
#include <cstdio>

using namespace std;

int sum;
int used[14];
int save[14];
void dfs(int num);
int main()
{
    for( int i = 1; i <= 13; i++ )
    {
        used[i]=4;
        save[i]=0;
    }
    dfs(1);
    printf("%d\n",sum);
    return 0;
}

void dfs(int num)
{
    if( num == 14 )
    {
        sum++;
        return ;
    }
    for( int i = 1; i <= 13; i++ )
    {
        if( used[i] != 0 && i >= save[num-1] )
        {
            used[i]--;
            save[num]=i;
            dfs(num+1);
            save[num]=0;
            used[i]++;
        }
    }
    return ;
}

7.

本质是一个环排列问题。有3颗黄色,4颗绿色,5颗紫色(颜色是我编的,无所谓了)珠子,串成一串手链。求所有不重复的情况数。环排列的公式我当时忘掉了,或者说压根没记住。但是我发现深搜得到的每种情况都会有12种重复,并且很容易想到不会出现逆序的情况。就深搜得到了答案,想一想其实原理也差不多。代码很简单,答案为:2310.

程序设计

8.

换饮料的题目,大概意思就是三个空瓶换一瓶饮料。问最多喝几瓶。之前在蓝桥杯官网上做到过,但是这次不能外借。不太习惯,刚开始还很纳闷,但是其实对于没做过的人来说反倒降低了难度。

关键代码:

    while( N >= 3 ){
        sum+=N-N%3;
        N=N/3+N%3;
    }
    //if( N == 2 )
    //    sum++;
    sum+=N;

9.

摞骰子问题。就是说有n个骰子摞在一起,但是有m组情况会使这摞骰子不稳定,所以要避免。比如1 2,所以1和2不能相邻。输入n,m;接下来m组数据。输出所有的可能数。注意每一个对着你的面不同都代表不同的情况,可以旋转。

一组样例:

输入:

2 1

1 2

输出:

544

分析:544=2×4×5×4+4×4×6×4;

这是一道dp,并且因为数据量太大,所以需要用滚动dp。具体数据量我忘记了,100%好象是10^9.因为结果可能数量太大,所以需要对10^9+7取模。

#include <iostream>
#include <cstring>
#include <cstdio>
#define mod 1000000007

using namespace std;

int N,M;
int a,b;
int dp[2][7];
int m[7][7];
long long sum;

int main()
{
    memset(m,0,sizeof(m));
    cin>>N>>M;
    for( int i = 0; i < M; i++ )
    {
        cin>>a>>b;
        m[a][b]=1;
        m[b][a]=1;
    }
    for( int i = 1; i <= 6; i++ )
        dp[0][i]=4;
    for( int i = 2; i <= N; i++ )
    {
        for( int j = 1; j <= 6; j++ )
        {
            for( int k = 1; k <= 6; k++ )
            {
                if( m[j][k] != 1 )
                {
                    dp[1][j]=((dp[1][j])%mod+(dp[0][k]*4)%mod)%mod;
                }
            }
        }
        for( int j = 1; j <= 6; j++ )
        {
            dp[0][j]=dp[1][j];
            dp[1][j]=0;
        }
    }
    for( int i = 1; i <= 6; i++ )
        sum=(sum%mod+dp[0][i]%mod)%mod;
    cout<<sum<<endl;
    return 0;
}

10.

这道题题意很复杂。因为讲的不是太清楚,理解了很久。大概抽象出来就是有N个村子,M条道路。现在道路全坏了,需要修路,每个道路的花费是P。但是修路只能从L到R中挑选能对K取余得到C的道路。每条路都是同时开工的,所以花费的最大时间就是所有这些道路中花费最大的一条。

从题目来看,应该是一道最短路(好像每次都有一道最短路的)。但是在如何松弛以及选择哪种方法之间抉择了很久。最开始想要用SPFA,但是后来注意到应该是一个多对多的问题,SPFA显然太复杂了。。。还是Floyed更好一点,哈哈。也就到这种程度了。那现在关键是松弛条件,其实想一想其实和纯Floyed很相似的,但是我们要找的是整条路上的最大的花费时间,而每条路最大的花费时间是等于可以松弛的另两条路的较大的那一个的。类似于Floyed,所以就很简单了,但是因为是大数据,我也不知道这种想法究竟能过多少,看人品了吧。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 5000
#define INF 0x7ffffff
using namespace std;

int N,M,Q;
int x,y,p;
int L,R,K,C;
int num,res;
int m[MAX][MAX];
int save[MAX];
void Floyed();
int main()
{
    cin>>N>>M>>Q;
    for( int i = 1; i <= N; i++ )
    {
        for( int j = 1; j <= N; j++ )
        {
            m[i][j]=INF;
        }
    }
    for( int i = 0; i < M; i++ )
    {
        cin>>x>>y>>p;
        m[x][y]=min(m[x][y],p);
        m[y][x]=min(m[y][x],p);
    }
    Floyed();
    for( int i = 0; i < Q; i++ )
    {
        cin>>L>>R>>K>>C;
        num=0;res=-1;
        memset(save,0,sizeof(save));
        for( int j = L; j <= R; j++ )
        {
            if( j % K == 0 )
            {
                save[num]=j;
                num++;
            }
        }
        for( int j = 0; j < num; j++ )
            for( int k = j; k < num; k++ )
                res = max( res,m[save[j]][save[k]]);
        cout<<res<<endl;
    }
    return 0;
}

void Floyed()
{
    for( int k = 1; k <= N; k++ )
    {
        for( int i = 1; i <= N; i++ )
        {
            for( int j = 1; j <= N; j++ )
            {
                if( m[i][j] > max(m[i][k],m[k][j]) )
                    m[i][j] = max(m[i][k],m[k][j]);
            }
        }
    }
    return ;
}

总体觉得这次做得还好,都挺顺利的。做到最后一道题是有点急了,因为时间太久了后背冒虚汗。。。。但是回来问到团队里的其他人好像都不太理想,晚上聚餐听他们说的话挺伤感的。不知道自己能在算法的道路上走多久。改天再单独写篇博客好了。。希望能有机会进入决赛,等待最后的结果吧。

时间: 2024-08-25 09:17:54

第五届蓝桥杯C++本科A组的相关文章

2014第五届蓝桥杯JAVA本科B组_猜字母

1 /* 2 把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串.   3 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母.   4 得到的新串再进行删除奇数位置字母的动作.如此下去,最后只剩下一个字母,请写出该字母.   5 答案是一个小写字母,请通过浏览器提交答案.不要填写任何多余的内容. 6 */ 7 public class Main { 8 public static void main(String[] args) { 9

第五届蓝桥杯软件大赛C/C++本科B组决赛解题报告

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)

目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施   1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现了一堆金币.他把金币分成5等份.发现刚好少一个金币.他就从自己口袋拿出一个金币补充进去,然后把属于自己的那份拿走. 第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个

第五届蓝桥杯全国软件设计大赛--2013年校内选拔赛Java题目

第五届蓝桥杯全国软件设计大赛 2013年校内选拔赛Java题目 一.考生注意: (1)[结果填空题]要求参赛选手根据题目描述直接填写结果.求解方式不限.不要求源代码. 把答案存入[考生文件夹]下对应题号的文件中即可. (2)[代码填空题]要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确.完整.所填写的代码不超过一条语句(即中间不能出现分号). 把填空的答案(仅填空处的答案,不包括题面已存在的代码)存入[考生文件夹]下对应题号的文件中中即可. (3)[编程题]要求选手设计

第五届蓝桥杯练习题 - 入门练习Java解题代码

>>入门训练 圆的面积 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误. 实数输出的问题

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

第七届蓝桥杯C语言C组-(自己懂的题目)

第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已.每张纸印有4版. 比如,某张报纸包含的4页是:5,6,11,12, 可以确定它应该是最上边的第2张报纸. 我们在太空中捡到了一张X星球的报纸,4个页码分别是: 1125,1126,1727,1728 请你计算这份报纸一共多少页(也就

第五届蓝桥杯 蚂蚁感冒

蚂蚁感冒 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. 输入 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分

2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一) A.今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”. 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内. 题解: 暴力枚举 answer: 1 代码如下: #