【2015蓝桥杯省赛】C++ B组试题
1.奖券数目
作答:52488,正确
#include <iostream>
using namespace std; bool check(int x) {
int a[] = { };
while (x) {
a[x % ]++;
x /= ;
}
if (a[] != )return false;
return true;
} int main() {
int res = ;
for (int i = ; i <= ; i++) {
if (check(i)) {
res++;
}
}
cout << res << endl;
return ;
}
2.星系炸弹
作答:2017-8-5,正确
算法基本功,日期判断 -_-。
#include <iostream>
using namespace std; int main() {
//根据2014年的来写的
int days[] = { ,,,,,,,,,,,, };
int year = , month = , day = ; for (int i = ; i < ; i++) {
cout << year << " " << month << " " << day << ": " << i << endl;
day++;
if (day == days[month] + ) {
month++;
day = ;
if (month == ) {
year++;
if (year % == || (year % == && year % != ))days[] = ;
else days[] = ;
month = ;
}
}
}
cout << year << " " << month << " " << day << endl;
return ;
}
3.三羊献瑞
作答:1085,正确
有进位,那么“三”一定是1,那么“祥”一定是9,那“羊”一定是0,但是“瑞”+“羊”又不是“瑞”,所以“生”+“献”有进位,那“生”就是“瑞”+1。(我只剪枝到加粗的部分,答案就一秒跑出来了,不需要继续剪枝了。)
有头脑的暴力搜索:
#include <iostream>
using namespace std; bool check1(int x) {
int a[] = {};
while (x) {
a[x % ]++;
x /= ;
}
for (int i = ; i <= ; i++) {
if (a[i] > )return false;
}
return true;
}
bool check2(int i,int j) {
int a[] = { };
int rui = j % ;
if (i / % != j % )return false;
while (i&&j) {
a[i % ]++; a[j % ]++; i /= ; j /= ;
}
for (int i = ; i <= ; i++) {
if (i == rui)continue;
if (a[i] > )return false;
}
return true;
}
bool check3(int i, int j, int k) {
int a[] = { };
if (k / != )return false;
if (k / % != )return false;
if (k / % != i / % )return false;
if (k / % != j % )return false;
while (i&&j) {
a[i % ]++; a[j % ]++; i /= ; j /= ;
}
if (a[k % ] != )return false;
return true;
} int main() {
for (int i = ; i <= ; i++) {
if (!check1(i))continue;
for (int j = ; j <= ; j++) {
if (!check2(i, j))continue;
if (check3(i, j, i + j)) {
cout << i << " " << j << " " << i + j << endl;
//system("pause");
}
}
}
return ;
}
4.格子中输出
实话实说,不百度,我之前真不知道这个%*s,是怎么用的,比较狠。
printf("%*s", 10, s); /*意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,这里等同于printf("%10s", s);*/
作答:
printf("%*s%s%*s", width/,"", buf, width/,""); //填空
正确答案:(width-strlen(s)-)/,"",s,(width-strlen(s)-)/,"" 备注:答案可以形式多样性,只要代入使得代码成立即可
5.九数组分数
回溯,没看代码猜出来的,那个位置,还能写啥,送人头 -_-
{t = x[i]; x[i] = x[k]; x[k] = t; }
6. 加法变乘法
作答:16,正确
#include <iostream>
#include <queue>
using namespace std; int sum(int *a,int i,int j) {
int s = ;
for (int k = ; k < ; k++) {
if (k == i) {
s += a[k + ] * a[k];
k++; }
else if (k == j) {
s += a[k + ] * a[k];
k++;
}
else
s += a[k];
}
return s;
}
int flag = ;
void DFS(int *a, int i, int j) {
if (i == j - )return;
if (sum(a, i, j) == &&(i!=)) {
flag = ;
cout << i << ' ' << j << endl;
return;
}
if (flag)return;
DFS(a, i, j - );
DFS(a, i + , j);
} int main() {
int a[];
for (int i = ; i < ; i++)a[i] = i;
//1,48
DFS(a, , );
}
7.牌型种数
答案:3598180
思路:DFS,相当于13个桶,每个桶选的牌数量五种情况 0,1,2,3,4, 到牌数量达到13张。
#include <iostream>
#include <algorithm>
using namespace std; int res = ;
void dfs(int pos, int cnt) {
if (cnt == ) {
res++;
return;
}
if (pos == ) {
return;
}
int num = min( - cnt, );
for (int i = ; i <= num; i++) {
dfs(pos + , cnt + i);
}
return;
}
int main() {
dfs(, );
cout << res << endl;
return ;
}
8.移动距离
刚看题目本来以为是最短路径的计算,其实简单很多,应该是有更便捷的方法,通过运算 O(1)解决,但这样也已经很快了。
#include <iostream>
using namespace std; int si, sj, ei, ej;
void initialize(int W,int L,int m,int n) {
int cnt = ;
for (int i = ; i < L; i++) {
if (si != && ei != && sj != && ej != )break;
if (i & ) {
for (int j = W - ; j >= ; j--) {
if (cnt == m) {
si = i;
sj = j;
}
if (cnt == n) {
ei = i;
ej = j;
}
cnt++;
}
}
else {
for (int j = ; j < W; j++) {
if (cnt == m) {
si = i;
sj = j;
}
if (cnt == n) {
ei = i;
ej = j;
}
cnt++;
}
} }
} int main() {
int W, m, n;
cin >> W >> m >> n;
//得到最大值
int MAX = m > n ? m : n;
//获取当前宽度、最大门牌号下需要的长度是多少
int L = MAX / W + ; initialize(W, L, m, n); int res = abs(si - ei) + abs(sj - ej);
cout << res << endl;
return ;
}
9. 垒骰子
百度首页推荐的很多都是错的,找了四份代码除了
之外,别的数据,输出四种答案。
这题想要做的话大概三种程度,DFS→DFS+记忆搜索→矩阵快速幂,但是难度跳跃太大 ~_~。
1. 作死算法
:
DFS(纯暴力,数字大于5就hold不住,但是可以用来验证代码正确性):
思想:侧面是不受应影响的,算出第height层,以p为底面的数量,乘上4^n就是结果。
LL DFS(int height, int p){
if (height == n) return ;
else{
LL t = ;
for (int i = ; i <= ; i++){
if (flag[i][opposite[p]])continue;
t = (t% N + DFS(height + , i) % N) % N;
}
return t;
}
}
完整代码:
给几个测试数据


2. 有头脑的作死算法:
DFS + 记忆搜索(跑到4000层多一点就 栈溢出 了):

纯DP层数可以再飞跃一次,大概10^6吧,但纯DP要从下往上,我没想出来怎么写。
3. 超级无敌哇塞碉堡了666挖掘机哪家强算法:
矩阵快速幂难点就在于怎么找矩阵递推方程。
记六阶矩阵 M 中,第 i 行第 j 列表示相邻两层是否能成功连接的情况。i 和 j 能连则为1,i 和 j 不能连则为0(注意是相邻两层的底面
,不是衔接面
,所以要取相反面。)
比如,我们以1 和 1 不能连接为例。
这个M矩阵应该是右边这个:

现在我们只需要右边这个图了,红色底面与蓝色地面满足的是矩阵M, 蓝色底面与黄色底面满足的也是矩阵M, 递推关系就出来了。

An = An-1 × M ,An = Mn-1 ,(A1是单位矩阵E,这里省略了)
完整代码:
10.生命之树
第一次树形DP,不知道是我有没有写错,比别人写的要简单,有时间再写一次,但思路上我觉得没有错误。
判断每个子树(包括叶子节点)的权值和是否大于0,
- 比0小就把这个子树砍去,给父节点一个0。
- 比0大就返回给父节点这个数。
用一个全局变量 MAX = INT_MIN; 记录DP过程中的最大值。
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std; int dp[];
int v[];
bool fuck[];
int MAX = INT_MIN; vector<int>nodes[]; void dfs(int u) {
dp[u] = v[u];
fuck[u] = true;
for (int i = ; i < nodes[u].size(); i++) {
int son = nodes[u][i];
if (fuck[son])continue;
dfs(son);
dp[u] += max(, dp[son]);
}
MAX = dp[u] > MAX ? dp[u] : MAX;
} int main() {
int n,t;
cin >> n;
for (int i = ; i <= n; i++) {
//10^5级别的输入,慎用cin
scanf("%d",&v[i]);
}
for (int i = ; i < n - ; i++) {
int from, to;
scanf("%d%d",&from,&to);
nodes[from].push_back(to);
nodes[to].push_back(from);
}
dfs();
cout << MAX << endl;
return ;
}
【2015蓝桥杯省赛】C++ B组试题的更多相关文章
- 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版
2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...
- 第八届蓝桥杯国赛java B组第三题
标题:树形显示 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关系更 ...
- 第四届蓝桥杯省赛 (JavaB组)
第二题:马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案 ...
- 2016年蓝桥杯省赛C++A组 消除尾一
消除尾一: 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 00000000000000000000000001 ...
- 蓝桥杯第十届C组试题C
从0开始,从右到左给这些字符串的每一位字母起个名字. 比如:A(1位)A(0位) A(2位)A(1位)A(0位) AA = 27, 可以看成(26 * 1)+ A(1) 因为:字母每经过一个轮回,可就 ...
- 52-2018 蓝桥杯省赛 B 组模拟赛(一)java
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...
- 带分数--第四届蓝桥杯省赛C++B/C组
第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...
- 2021蓝桥杯省赛B组(C/C++)E.路径【最短路DP】
2021蓝桥杯省赛B组题目(C/C++)E.路径 最短路径, 因为变化情况比较多, 所以开始想的是深搜, 但是太慢了, 跑不出来, 后来就想着优化一下, 有的地方到另一个地方可能会考虑很多遍, 于是考 ...
- 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心
问题描述 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 ...
随机推荐
- 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Latin1_General_100_CI_AS" 之间的排序规则冲突。
问题 操作临时表时提示如下排序规则冲突错误 sql ....忽略...sql ..... 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 " ...
- Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件
1. 使用 crontab -e 命令编辑定时任务列表 使用这个命令编辑的定时任务列表是属于用户级别的,初次编辑后在 /var/spool/cron 目录下生成一个与用户名相同的文件,文件内容就是我们 ...
- js 实现复制到粘贴板功能
前言:js 或者 jquery 都可以实现的复制到粘贴板功能,有时还想要有换行等格式(同 textarea) 网站地址:我的个人vue+element ui demo网站 github地址:yuleG ...
- 用数组指针遍历数组,FOR/FOREACH遍历数组
1. 用数组指针遍历一维数组 <?php header("Content-type:text/html;charset=utf-8"); /*用数组指针遍历一位数组的值*/ ...
- springboot项目的重定向和转发
下面是idea软件创建的项目目录,这里总结了一下转发与重定向的问题,详解如下. 首先解释一下每个文件夹的作用,如果你是用的是idea创建的springboot项目,会在项目创建的一开始resource ...
- CSS 属性-webkit-tap-highlight-color的理解
1.-webkit-tap-highlight-color 这个属性只用于iOS (iPhone和iPad).当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的 ...
- Android Studio插件之MVPHelper,一键生成MVP代码
MVP盛行,听到的最多的抱怨就是咋要写这么多接口,那么本文作者提供了一个插件,自动生成这些接口的声明.感兴趣的还可以学习该插件的写法,按照自己平时的需求修改,提供开发效率. MVPHelper 一款I ...
- protobuf 源代码分析 (1)准备工作
protobuf简介 protobuf是google开源的跨平台的一种数据序列化的代码自动生成器,支持c++.java和python语言,支持跨网络的传输数据,与平台类型无关.并且其生产的序列化数据具 ...
- Django之环境搭建
安装django pip install django 安装完django之后就有了可用的管理工具django-admin.py,我们可以用它来创建我们的项目. django-admin的语法: dj ...
- html + css + jquery实现简单的进度条实例
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...