文章目录

  • 前言
  • 一、奖券数目
  • 二、星系炸弹
  • 三、三羊献瑞
  • 四、格子中输出
  • 五、九数组分数
  • 六、加法变乘法
  • 七、牌型种数
  • 八、移动距离
  • 九、垒骰子
  • 十、生命之树

上一篇: 小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
下一篇: 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
历年题目合集:题目合集


前言

嘿嘿,又是快乐算法的一天!!!

一、奖券数目

题目描述:
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
分析分析:
怎么说有没有思路,像这种L1的题,和小唐直接写吧
我们一种是直接5个for暴力解决
还有一种就是我们对他进行一个模拟,然后我们直接从10000到99999模拟,然后用一个函数去看里面有没有4,很明显第二种的时间复杂度更小
题目代码:

#include <iostream>
using namespace std;
int panduan(int n)
{while(n){if(n%10==4){return 1;}n/=10;}return 0;
}
int main()
{int count=0;for(int i=10000;i<=99999;i++){if(panduan(i)) continue;count++;}cout<<count;
}

运行结果:

52488

二、星系炸弹

题目描述:
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
分析分析:
他来了他来了,好欸,是对于日期的模拟!!!他就是一个我们对于日期的累加
注意:大小月!!!注意润平年!!!over!!!
题目代码:

#include <iostream>
#include <stdio.h>
using namespace std;
void fact(int year,int yue,int tian,int ri)
{for(int i=1;i<=ri;i++){tian++;//1 3 5 7 8 10 12if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(tian>31){tian=1;yue++;}}if(yue==4||yue==6||yue==9||yue==11){if(tian>30){tian=1;yue++;}}if(year%4==0||year%400==0&&year%100!=0){if(yue==2&&tian>29){tian=1;yue++;}}else{if(yue==2&&tian>28){tian=1;yue++;}}if(yue==13){year++;yue=1;}}printf("%d-",year);if(yue<10)printf("0%d-",yue);elseprintf("%d-",yue);if(tian<10)printf("0%d",tian);elseprintf("%d",tian);
}
int main()
{fact(2014,11,9,1000);
}

运行结果:

2017-08-05

三、三羊献瑞

题目描述:

     祥 瑞 生 辉+  三 羊 献 瑞
-------------------三 羊 生 瑞 气

分析分析:
啊哈哈哈哈哈,怎么样家人们,一共有几个字

三 羊  生 瑞 气 辉 祥
1  2  3  4  5  6  7

又又又是我们全排列了,但是我们有一点要注意!
那就是我们的 三 和 羊不可以为0,直接开始吧
不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容
题目代码:

#include <iostream>
#include <algorithm>
#include <cmath>
int a[10]={0,1,2,3,4,5,6,7,8,9};
using namespace std;
int main()
{while(next_permutation(a,a+10)){if(a[0]!=0&&a[4]!=0){if(fabs(a[0]*1000+a[1]*100+a[2]*10+a[3]+a[4]*1000+a[5]*100+a[6]*10+a[1]-a[4]*10000-a[5]*1000-a[2]*100-a[1]*10-a[7])==0){cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;cout<<a[4]<<a[5]<<a[6]<<a[1]<<endl;cout<<a[4]<<a[5]<<a[2]<<a[1]<<a[7]<<endl;}}}
}

运行结果:

1085

四、格子中输出

题目描述:
StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。
下面的程序实现这个逻辑,请填写划线部分缺少的代码。

#include <stdio.h>
#include <string.h>void StringInGrid(int width, int height, const char* s)
{int i,k;char buf[1000];strcpy(buf, s);if(strlen(s)>width-2) buf[width-2]=0;printf("+");for(i=0;i<width-2;i++) printf("-");printf("+\n");for(k=1; k<(height-1)/2;k++){printf("|");for(i=0;i<width-2;i++) printf(" ");printf("|\n");}printf("|");printf("%*s%s%*s",_____________________________________________);  //填空printf("|\n");for(k=(height-1)/2+1; k<height-1; k++){printf("|");for(i=0;i<width-2;i++) printf(" ");printf("|\n");} printf("+");for(i=0;i<width-2;i++) printf("-");printf("+\n");
}int main()
{StringInGrid(20,6,"abcd1234");return 0;
}

分析分析:
嘿嘿,这个小唐也没什么好说的,对于这种不是算法,但是考验我们的题目,我们就直接把式子代入,然后去看我们的运行结果

也就是我们对于width来进行操作
题目代码:

width-2-strlen(s))/2," ",s,width-2-strlen(s)-(width-2-strlen(s))/2," "

五、九数组分数

题目描述:
1,2,3…9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。

#include <stdio.h>
void test(int x[])
{int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];if(a*3==b) printf("%d / %d\n", a, b);
}void f(int x[], int k)
{int i,t;if(k>=9){test(x);return;}for(i=k; i<9; i++){{t=x[k]; x[k]=x[i]; x[i]=t;}f(x,k+1);_____________________________________________ // 填空处}
}int main()
{int x[] = {1,2,3,4,5,6,7,8,9};f(x,0); return 0;
}

分析分析:
先来看看这是一个什么牛马,test很明显只是一个检验结果的,我们不管他
主要的就是我们的f()函数
递归出口是k=9
里面的话也就是相当于一个 在交换位置,然后去去排列的过程
其实这个题目在前面的时候就已经给了出来提示喔

{t=x[k]; x[k]=x[i]; x[i]=t;}

递归出来之后我们要记得把他还原!!!
所以就是

{t=x[k]; x[k]=x[i]; x[i]=t;}

题目代码:

{t=x[k]; x[k]=x[i]; x[i]=t;}

六、加法变乘法

题目描述:
我们都知道:1+2+3+ … + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+…+10 * 11+12+…+27 * 28+29+…+49 = 2015
就是符合要求的答案。请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
分析分析:
像这种题目,我们直接模拟运算就可以啦
你看,比如我们使用
10 * 11 和 27 * 28
那我们就是在原来的基础上面1125-10-11-27-28+10 * 11+27 * 28=2015
我们直接两个for循环,over
题目代码:

#include <iostream>
#include <algorithm>
#include <cmath>
//a[1 2 3 4 5 6]
//  0 1 2 3 4 5
//a[+ + + + + +]
//  0 1 2 3 4 5
using namespace std;
int main()
{int a[49];for(int i=0;i<49;i++){a[i]=i;}for(int i=0;i<48;i++)for(int j=i+2;j<48;j++){if((1225-a[i]-a[i+1]-a[j]-a[j+1]+(a[i]*a[i+1])+(a[j]*a[j+1]))==2015){cout<<i<<endl;}}
}

运行结果:

16

七、牌型种数

题目描述:
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
分析分析:
小小递归,这个东西你不打过牌,我感觉还不是很好做啊哈哈哈哈哈哈
我们一共是会有 2.3.4.5.6.7.8.9.10.J.Q.K.A一共13张牌,每一张牌有4张,也就是我们有5种可能
然后我们就可以开始我们的递归了!!!
题目代码:

#include <iostream>
using namespace std;
int ans = 0;
void find(int k, int cnt) {//这个是我们不合理的情况,我们直接跳过 if(cnt > 13 || k > 13) {return ;}//如果我们刚好等于13就记录下来 if(k == 13 && cnt == 13) {ans++;return ;}//每一种牌都有五种可能 ,0,1,2,3,4张的可能 for(int i = 0; i < 5; i++) {find(k + 1, cnt + i);}
}int main() {find(0, 0);cout << ans;return 0;
}

运行结果:

3598180

八、移动距离

题目描述:
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1    2   3   4   5  6
12  11  10   9   8  7
13  14  15   16  17 18

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。
分析分析:
嘿嘿,觉得怎么样,我们按前面的时候就是再给我们前面排号
小唐的思路就是,看好了!!!
例如
6 8 2
输出:
4

递推公式
奇数:
楼层数:ceil(n/(double)w)
排号:  ceil(n/(double)w)*w-n+1;【我们该楼层最大号-我们的楼号】偶数:
楼层数:ceil(n/(double)w)
排号:  n-(ceil(n/(double)w)-1)*w;【我们楼号-上一层最大楼号】

题目代码:

#include<iostream>
#include <math.h>
using namespace std;
int find(int w,int n)
{int temp,hao;temp=ceil(n/(double)w); //求出我们n所在楼数if(temp%2==0)//如果是偶数 {hao=temp*w-n+1;}else//不是偶数 {hao=n-(temp-1)*w;}return temp+hao;
}
int main()
{int w,n,m,sum1,sum2;cin>>w>>n>>m;sum1=find(w,n);sum2=find(w,m);cout<<fabs(sum1-sum2);
}

运行结果:

【样例输入】
6 8 2
【样例输出】
4【样例输入】
4 7 20
【样例输出】
5

九、垒骰子

题目描述:
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~
分析分析:
这个题目小唐有点没有看懂,参考这个人的
参考链接
题目代码:

#include<iostream>//正确分析得出分析得出dp转移方程。
#include<cstring>
using namespace std;
typedef long long int ll;
const ll mod=1e9+7;
struct matrix{ll a[6][6];
}dp;
bool vst[6][6];
void in1t(){for(int i=0;i<6;i++)for(int j=0;j<6;j++){dp.a[i][j]=1;}memset(vst,0,sizeof(vst));
}
matrix mul(matrix a,matrix b,ll mod){matrix c;for(int i=0;i<6;i++)for(int j=0;j<6;j++){c.a[i][j]=0;if(vst[i][j])continue;for(int k=0;k<6;k++){c.a[i][j]+=((a.a[i][k]%mod)*(b.a[k][j]%mod))%mod;c.a[i][j]%=mod;}   }return c;
}
matrix init(){matrix a;for(int i=0;i<6;i++){for(int j=0;j<6;j++){if(i==j)a.a[i][j]=1;else a.a[i][j]=0;}}return a;
}
matrix pow(matrix a,ll b,ll mod){matrix res=init(),temp=a;for(;b;b/=2){if(b&1){res=mul(res,temp,mod);}temp=mul(temp,temp,mod);}return res;
}
ll pow1(ll a,ll b,ll mod){ll res=1,temp=a;for(;b;b/=2){if(b&1){res=res*temp%mod;}temp=temp*temp%mod;}return res;
}
ll sum(matrix a,ll mod){ll ans=0;for(int i=0;i<6;i++){for(int j=0;j<6;j++){ans+=a.a[i][j]%mod;ans%=mod;}}return ans;
}
int main(){ll n,m;cin>>n>>m;in1t();for(int i=0;i<m;i++){int a,b;cin>>a>>b;a=a-1;//因为矩阵是从0开始编号 的所以应该-1;b=b-1;dp.a[a][(b+3)%6]=0;//(b+3)%6表示与a不能同一个面的顶面。dp.a[b][(a+3)%6]=0;//表示的意思是,第b面朝上时,下一个骰子的第(a+3)%6面不可能朝上。理解了这一点就ok了。}dp=pow(dp,n-1,mod);//dp[i]=A*dp[i-1];ll a1=pow1(4,n,mod);ll ans=sum(dp,mod);cout<<(a1*ans)%mod<<endl;}

运行结果:

「样例输入」2 11 2
「样例输出」 544

十、生命之树

题目描述:
在X森林里,上帝创建了生命之树。
他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。
上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, …, vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。
在这个前提下,上帝要使得S中的点所对应的整数的和尽量大。
这个最大的和就是上帝给生命之树的评分。
经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。
分析分析:
题目大概的意思就是,给定一颗无根树,求出一个字数,所有节点的权值之和最大。求出最大的数是多少。
题目代码:

#include<cstdio>
#include<cstring>
#include<vector>
#define N 100005
using namespace std;
vector<int> node[N];
// dp[i][0],dp[i][1];
// 分别表示选i结点和不选能得到的最大分数
int dp[N][2];
int v[N],vis[N];
int n,a,b;
void dfs(int u){dp[u][1] = v[u];dp[u][0] = 0;vis[u]=1;for(int i=0 ;i<node[u].size();i++){if(!vis[node[u][i]]){dfs(node[u][i]);dp[u][1] += max(dp[node[u][i]][1],dp[node[u][i]][0]);}else{dp[u][1] = max(dp[u][1],v[u]);dp[u][0] = max(dp[u][0],0);}}
} void init(){memset(v,0,sizeof(v));memset(dp,0,sizeof(dp));scanf("%d",&n);for(int i=1 ;i<=n ;i++){scanf("%d",&v[i]);}for(int i=1 ;i<n ;i++){scanf("%d%d",&a,&b);node[a].push_back(b);node[b].push_back(a);}
}int main(){init();dfs(1);int ans = -1;for(int i=1 ;i<=n ;i++){ans = max(ans,dp[i][1]);ans = max(ans,dp[i][0]);}printf("%d\n",ans);return 0;
}

运行结果:

样例输入」 5
1 -2 -3 4 54 23 11 22 5
「样例输出」8

上一篇: 小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
下一篇: 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
历年题目合集:题目合集

小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题相关推荐

  1. 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.啤酒和饮料 二.切面条 三.李白打酒 四.史丰收速算 五.打印图形 六.奇怪的分式 七.六角填数 八.蚂蚁感冒 九.地宫取宝 十.小朋友排队 上一篇: 小唐开始刷蓝桥(六)2015 ...

  2. 小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.煤球数目 二.生日蜡烛 三.凑算式 四.快速排序 五.抽签 六.方格填数 七.剪邮票 八.四平方和 九.交换瓶子 十.最大比例 上一篇: 小唐开始刷蓝桥(四)2017年第八届C/C ...

  3. 小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.组队 二.年号字符 三.数列求值 四.数的分解 五.迷宫 六.特别数的和 七.完全二叉树的权值 八.等差数列 九.后缀表达式 十.灵能传输 上一篇: 小唐开始刷蓝桥(一)2020年 ...

  4. 小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题

    目录 一.门牌制作 二.既约分数 三.蛇形填数 四.跑步锻炼 五.七段码 六.成绩统计 七.回文日期 八.子串分值和 九.平面切分 十.字串排序 上一篇: 呆呆子,这就是小唐的第一篇啦! 下一篇: 小 ...

  5. 小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.第几天 二.明码 三.乘积尾零 四.测试次数 五.快速排序 六.递增三元组 七.螺旋折线 八.日志统计 九.全球变暖 十.乘积最大 上一篇: 小唐开始刷蓝桥(二)2019年第十届C ...

  6. 小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.微生物增殖 二.古堡算式 三.比酒量 四.奇怪的比赛 五.方阵转置 六.大数乘法 七.放棋子 八.密码发生器 九.夺冠概率 十.取球游戏 上一篇: 小唐开始刷蓝桥(八)2013年第 ...

  7. 小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.高斯日记 二.马虎的算式 三.第39级台阶 四.黄金连分数 五.前缀判断 六.三部排序 七.错误票据 八.翻硬币 九.带分数 十.连号区间数 上一篇: 小唐开始刷蓝桥(七)2014 ...

  8. 小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.购物单 二.等差素数列 三.承压计算 四.方格分割 五.取数位 六.最大公共子串 七.日期问题 八.包子凑数 九.分巧克力 十.k倍区间 上一篇: 小唐开始刷蓝桥(三)2019年第 ...

  9. 3位水仙花数计算pythonoj_Python解答蓝桥杯省赛真题之从入门到真题

    若发现此文章消失,则是在等待审核中,稍等一会儿即可显示,谢谢. 另外,我会尽量晚上上传更新题目. 此文章太长了,导致MD编辑器很卡,另写了一篇接续 传送门 Python解答蓝桥杯省赛真题之从入门到真题 ...

最新文章

  1. 软件测试面试的linux基础知识,linux基础面试题
  2. c++ vscode 第三方库_Windows平台配置VSCode的C/C++环境,超清晰
  3. es6 ik分词热更新MySQL_rollup环境搭建(es6转es5、压缩、本地服务器、热更新)
  4. js笔记 - ajax中的get和post说明
  5. Oracle服务自动启动脚本
  6. 使用U盘安装Windows Server2008
  7. # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
  8. 2021.08.22学习内容torch.cat()和torch.stack()函数
  9. Asynchronous(异步处理-Generator)
  10. 【STM32】关闭JTAG接口,引脚设置推挽输出
  11. Python+OpenCV:图像金字塔
  12. 汇编语言虚拟机dosbox0.74使用教程
  13. STM32接入机智云--实现数据上传和命令下发
  14. 手机火狐浏览器怎么开启flash_火狐浏览器flash插件怎么启用?
  15. PadOS迅雷testflight下载教程
  16. TCA9548A IIC多路扩展模块使用
  17. android studio 模拟器很慢,解决AndroidStudio模拟器卡慢的问题
  18. 自定义Google搜索引擎
  19. 厦门大学计算机保研学校,厦门大学计算机科学系(专业学位)计算机技术保研夏令营...
  20. ReadHub android版

热门文章

  1. 什么叫信息内容安全?
  2. 数据库设计原则和优化
  3. 计算机专业基础知识(中)
  4. uget以及磁力贴软件下载
  5. 【数据结构】双向链表(带头双向循环链表)——超详细代码
  6. 罗斯蒙特变送器的接线方式
  7. addmodule 和aucell打分评分
  8. STM32实战总结:HAL之电机
  9. multism中ui和uo应该怎么表示_基于multism的串联型直流稳压电源设计与仿真
  10. HCIP之MPLS中的VPN