# 第四届蓝桥杯B组预赛

``````#include <queue>
#include <iostream>
#include <stack>
using namespace std;
typedef  long long in;
int month[2][13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int y, m, d;
int f;
int yyy(int yy)
{
if (yy % 400 == 0 || (yy % 4 == 0 && (yy % 100 != 0)))
{
return 0;//run nian;
}
return 1;
}
int main() {
y = 1791, m = 12, d = 15;
int n;
cin >> n;
while (n--)
{
d++;
f = yyy(y);
if (d > month[f][m])
{
m++;
if (m > 12)
{
y++;
m = 1;
}
d = 1;
}
}
cout << y << "  " << m << "  " << d;
return 0;
}

``````

``````// ab * cde = adb * ce
#include<iostream>
using namespace std;
int ans = 0;
int main()
{
int a, b, c, d, e;
for (a = 1; a < 10; a++)
{
for (b = 1; b < 10; b++)
{
for (c = 1; c < 10; c++)
{
for (d = 1; d < 10; d++)
{
for (e = 1; e < 10; e++)
{
if (a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&e!=d)
if ((a * 10 + b) * (c * 100 + 10 * d + e) == (a * 100 + 10 * d + b) *(10 * c + e))
{
ans++;
}
}
}
}
}
}
cout << ans;
return 0;
}
``````

``````#include<iostream>
using namespace std;
int f[40];
int fun(int n,int f)
{
if(n==1)//一步
{
if(f==1)//左脚
return 1;
return 0;
}
if(n==2)//不管第二个台阶只能是一种
{
return 1;
}
int r=fun(n-1,!f)+fun(n-2,!f);
return r;
}
int main()
{

cout<<fun(39,0);
return 0;
}
``````

1

1
1 + -----------------
1
1 + -------------
1
1 + ---------
1 + ...

（注意尾部的0，不能忽略）

=========================================================

``````#include"stdio.h"
int a[101];//a保存小数结果
//输出一个数组中保存的值
void print(int *x)
{
int i, j;
for (i = 99; i >= 0; i--)
if (x[i])
{
j = i;
break;
}
for (i = j; i >= 0; i--)
printf("%d", x[i]);
printf("\n");
}

void add(int *x, int *y)
{
int i, length_x, length_y;
int jinwei = 0;//记录进位
int temp_y[100];
for (i = 0; i<100; i++)//计算两个数字的长度
{
if (x[i] == 0)
length_x = i;
if (y[i] == 0)
length_y = i;
temp_y[i] = y[i];
}
//x[0]保存最低位
for (i = 0; i<100; i++)//y=y+x,x=y
{
y[i] = x[i] + y[i] + jinwei;
jinwei = y[i] / 10;
y[i] = y[i] % 10;
}
for (i = 0; i<100; i++)
x[i] = temp_y[i];//把之前的分母传给分子
}

//比较两个数数组里面保存的数字的大小,x[0]是最低位
int subcmp(int *x, int *y)
{
int j_x, j_y, i;
for (i = 99; i >= 0; i--)//确定最高位
if (x[i])
{
j_x = i;
break;
}
for (i = 99; i >= 0; i--)//确定最高位
if (y[i])
{
j_y = i;
break;
}
if (j_x>j_y) return 1; //x中的值大于y中的
if (j_x<j_y) return -1;//x中的值小于y中的
if (j_x == j_y)//当两个数位数相同的时候
{
for (i = j_x; i >= 0; i--)
{
if (x[i]>y[i]) return 1;
if (x[i]<y[i]) return -1;
}
}
return 0;
}

//两个数相减,结果保存在x[]中
void sub(int *x, int *y)
{
//这里保证x[]>y[]
int j_y, i;
for (i = 99; i >= 0; i--)//确定最高位
if (x[i])
{
j_y = i;
break;
}
//从数的低位到高位依次相减
for (i = 0; i <= j_y; i++)
{
if (x[i] >= y[i])
{
x[i] = x[i] - y[i];
continue;
}
if (x[i]<y[i])
{
x[i] = x[i] + 10 - y[i];
x[i + 1]--;
}
}
}

void xiaoshu(int *x, int *y)
{
int i, xx[100], yy[100];
for (i = 0; i<100; i++)//将两个数组保存起来以防止干扰原数组的值
{
xx[i] = x[i];
yy[i] = y[i];
}
for (i = 0; i<101; i++)
{
if (-1 == subcmp(xx, yy))
{
a[i++] = 0;//分子小于分母，这一位为0
for (int j = 99; j >= 1; j--)
xx[j] = xx[j - 1];
xx[0] = 0;//扩大十倍,相当于分子成了一个10；
}
while (subcmp(xx, yy) >= 0)//a[i]为商；
{
a[i]++;
sub(xx, yy);
}
for (int j = 99; j >= 1; j--)//上面已经算好了一位
xx[j] = xx[j - 1];
xx[0] = 0;//每算完一位,扩大十倍
}
}

int main()
{
int x[100] = { 0 }, y[100] = { 0 };//x是被除数,y是除数
int i, b[200];
b[0] = 1, b[1] = 2;
x[0] = 1, y[0] = 2;
for (i = 0; i<250; i++)
add(x, y);

printf("dsfsdf\n");
printf("此时被除数的值是:\n");
print(x);
printf("此时除数的值是:\n");
print(y);
xiaoshu(x, y);
printf("0.\n");
for (i = 1; i<101; i++)
{
printf("%d ", a[i]);
if (i % 10 == 0)
printf("\n");
}
return 0;
}
``````

char* prefix(char* haystack_start, char* needle_start)
{
char* haystack = haystack_start;
char* needle = needle_start;

while(*haystack && *needle){
if(______________________________) return NULL; //填空位置
}

if(*needle) return NULL;

return haystack_start;
}

void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;

while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
__________________________; //填空位置
}
}

}

25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0

-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25

7、标题：错误票据

2
5 6 8 11 9
10 12 9

7 9

6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

105 120

CPU消耗 < 1000ms

==========================================================后面在蓝桥杯官网跑了一遍，是错的呀，可能有事后数字末尾是空格 叭叭叭粑粑，后一个方法过了

``````#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int nu[1000];
int main()
{
int n, m;
cin >> n;
int nn;
nn = n;
int i = 0;
char c;
while (n)
{
scanf("%d%c", &nu[i++], &c);
if (c == '\n')
n--;
}
sort(nu, nu + i);
int temp = nu[0];
int copy=0, disa=0;
for (int j = 1; j<i; j++)
{
if (temp == nu[j] -2)
{
disa = temp +1;
}
if (temp == nu[j])
{
copy = temp;
}
temp = nu[j];
}
cout << disa << "　" << copy;
return 0;
}
``````

``````#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
int n;
char a;
char b;
int x;
int num[10005];
char s[10000];
int main()
{
string k;
cin >> n;
int nn = n;
getchar();
int i = 0;
int f = 0;
while (nn--)
{
getline(cin, k);
for (int j = 0; j< k.length(); j++)
{
a = k[j];
if (a >= '0'&&a <= '9')//数字
{
x = x * 10 + a - '0';
f = 1;
}
if (a ==' '&&f == 1)//等于空格，有数字
{
num[i] = x;
i++;
x = 0;
f = 0;
}

}
if (f)
{
num[i] = x;
i++;
x = 0;
f = 0;
}
}
sort(num, num + i);
int x1, x2,x3;
x1 = num[0];
for (int j = 1; j < i; j++)
{
if (x1 != num[j]-1)
{
if (x1 == num[j])
{
x3 = num[j];
}
else
x2 = num[j]-1;//断号ID；
}
x1 = num[j];
}
cout << x2 << " " << x3 << endl;
return 0;
}
``````
1. 题目标题：翻硬币
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面，用 o 表示反面（是小写字母，不是零）。
比如，可能情形是：oooooo
如果同时翻转左边的两个硬币，则变为：oooo
**oooo
现在小明的问题是：如果已知了初始状态和要达到的目标状态，每次只能同时翻转相邻的两个硬币,那么对特定的局面，最少要翻动多少次呢？
我们约定：把翻动相邻的两个硬币叫做一步操作，那么要求：
程序输入：
两行等长的字符串，分别表示初始状态和要达到的目标状态。每行的长度<1000
程序输出：
一个整数，表示最小操作步数

o****o****

5

ooo*
ooo***

1

CPU消耗 < 1000ms

``````#include<iostream>
#include<string>
using namespace std;
string s;
string ss;
int main()
{
cin>>s>>ss;
int n=0;
for(int i=0;i<s.length();i++)
{
if(s[i]!=ss[i])
{
n++;
if(s[i]=='*')
{
s[i]='o';
}
else
{
s[i]='*';
}
if(s[i+1]=='*')
{
s[i+1]='o';
}
else
{
s[i+1]='*';
}
}
}
cout<<n;
return 0;
}

``````
1. 标题：带分数
100 可以表示为带分数的形式：100 = 3 + 69258 / 714
还可以表示为：100 = 82 + 3546 / 197
注意特征：带分数中，数字1~9分别出现且只出现一次（不包含0）。
类似这样的带分数，100 有 11 种表示法。
题目要求：
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意：不要求输出每个表示，只统计有多少表示法！
例如：
用户输入：
100
程序输出：
11

105

6

CPU消耗 < 3000ms

``````#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int ans = 0;
int b = 0, c = 0, d = 0;
int bb, cc, dd;
int num = 0;
int a[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//n= b+c/d;
do{
num++;
for (int i = 0; i<6; i++)//b 的取值 只能是1到6位
{
for (int j = 0; j <= i; j++)
{
b = b * 10 + a[j];//求得b的值
bb = b;
}
b = 0;
if (bb<n)//b要小于n
{
for (int k = i + 1; k<9; k++)//结束位置  c 的结束2位置
{
if ((k - i) >= (8 - k)) //c的个数要比d多
{
for (int kk = i + 1; kk <= k; kk++)//计算c的值
{
c = c * 10 + a[kk];//c的大小
}
cc = c;
c = 0;
for (int kk = k + 1; kk <= 8; kk++)
{
d = d * 10 + a[kk];//c的大小
}
dd = d;
d = 0;
if (cc>dd)
{
if ((n - bb)*dd == cc)
{
//cout << n << "  " << bb << "  " << cc << "  " << dd << endl;
ans++;
}
}
}
}
}
}
} while (next_permutation(a, a + 9));
cout << ans;
return 0;
}
``````
1. 标题：连号区间数
小明这些天一直在思考这样一个奇怪而有趣的问题：
在1~N的某个全排列中有多少个连号区间呢？这里所说的连号区间的定义是：
如果区间[L, R] 里的所有元素（即此排列的第L个到第R个元素）递增排序后能得到一个长度为R-L+1的“连续”数列，则称这个区间连号区间。
当N很小的时候，小明可以很快地算出答案，但是当N变大的时候，问题就不是那么简单了，现在小明需要你的帮助。
输入格式：
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
第二行是N个不同的数字Pi(1 <= Pi <= N)， 表示这N个数字的某一全排列。
输出格式：
输出一个整数，表示不同连号区间的数目。

4
3 2 4 1

7

5
3 4 2 5 1

9

CPU消耗 < 5000ms

# 法二： 比较高级的办法，但是好像时间还要用的多一些样,

``````#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int num[50000];
int n,m,k;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
int minn=n;
int maxn=0;
int ans=0;
for(int i=0;i<n;i++)
{
minn=n;
maxn=0;
for(int j=i;j<n;j++)
{
minn=min(num[j],minn);
maxn=max(maxn,num[j]);
if((j-i)==(maxn-minn))
{
ans++;
}
}
}
cout<<ans;
return 0;
}
``````

``````#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int dp[50000][16];//每个区间最大的
int num[50000];
int dp2[50000][16];
int fun1(int i,int j)
{
int sum=j-i+1;
int n=log2(sum);//n的几次方
int maxn=dp[i][n];
int nn;
nn=n;
int ii=i;
sum-=(1<<n);
while(sum!=0)
{
ii+=(1<<n);
n=log2(sum);
maxn=max(maxn,dp[ii][n]);
sum-=(1<<n);
}
return maxn;
}
int fun2(int i,int j)
{
int ii=i;
int sum=j-i+1;
int n=log2(sum);
int minx=dp2[ii][n];
sum-=(1<<n);
while(sum!=0)
{
ii+=(1<<n);
n=log2(sum);
minx=min(minx,dp2[ii][n]);
sum-=(1<<n);
}
return minx;
}
int main()
{
int n;
cin>>n;
memset(dp,0,sizeof(dp));
memset(dp2,0,sizeof(dp2));
int ans=0;
for(int i=0;i<n;i++)
{
cin>>num[i];
dp[i][0]=num[i];
dp2[i][0]=num[i];
}
for(int j=1;j<=log2(n);j++)
{
for(int i=0;(1<<j)+i-1<n;i++)
{
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
}
}
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{

if((fun1(i,j)-fun2(i,j))==(j-i))
{
ans++;
}
}
}
cout<<ans;
return 0;
}
``````

©著作权归作者所有,转载或内容合作请联系作者
• 序言：七十年代末，一起剥皮案震惊了整个滨河市，随后出现的几起案子，更是在滨河造成了极大的恐慌，老刑警刘岩，带你破解...
沈念sama阅读 157,373评论 4 361
• 序言：滨河连续发生了三起死亡事件，死亡现场离奇诡异，居然都是意外死亡，警方通过查阅死者的电脑和手机，发现死者居然都...
沈念sama阅读 66,732评论 1 290
• 文/潘晓璐 我一进店门，熙熙楼的掌柜王于贵愁眉苦脸地迎上来，“玉大人，你说我怎么就摊上这事。” “怎么了？”我有些...
开封第一讲书人阅读 107,163评论 0 238
• 文/不坏的土叔 我叫张陵，是天一观的道长。 经常有香客问我，道长，这世上最难降的妖魔是什么？ 我笑而不...
开封第一讲书人阅读 43,700评论 0 202
• 正文 为了忘掉前任，我火速办了婚礼，结果婚礼上，老公的妹妹穿的比我还像新娘。我一直安慰自己，他们只是感情好，可当我...
茶点故事阅读 52,036评论 3 286
• 文/花漫 我一把揭开白布。 她就那样静静地躺着，像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上，一...
开封第一讲书人阅读 40,425评论 1 211
• 那天，我揣着相机与录音，去河边找鬼。 笑死，一个胖子当着我的面吹牛，可吹牛的内容都是我干的。 我是一名探鬼主播，决...
沈念sama阅读 31,737评论 2 310
• 文/苍兰香墨 我猛地睁开眼，长吁一口气：“原来是场噩梦啊……” “哼！你这毒妇竟也来了？” 一声冷哼从身侧响起，我...
开封第一讲书人阅读 30,421评论 0 194
• 序言：老挝万荣一对情侣失踪，失踪者是张志新（化名）和其女友刘颖，没想到半个月后，有当地人在树林里发现了一具尸体，经...
沈念sama阅读 34,141评论 1 239
• 正文 独居荒郊野岭守林人离奇死亡，尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
茶点故事阅读 30,398评论 2 243
• 正文 我和宋清朗相恋三年，在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
茶点故事阅读 31,908评论 1 257
• 序言：一个原本活蹦乱跳的男人离奇死亡，死状恐怖，灵堂内的尸体忽然破棺而出，到底是诈尸还是另有隐情，我是刑警宁泽，带...
沈念sama阅读 28,276评论 2 251
• 正文 年R本政府宣布，位于F岛的核电站，受9级特大地震影响，放射性物质发生泄漏。R本人自食恶果不足惜，却给世界环境...
茶点故事阅读 32,907评论 3 233
• 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹，春花似锦、人声如沸。这庄子的主人今日做“春日...
开封第一讲书人阅读 26,018评论 0 8
• 文/苍兰香墨 我抬头看了看天上的太阳。三九已至，却和暖如春，着一层夹袄步出监牢的瞬间，已是汗流浃背。 一阵脚步声响...
开封第一讲书人阅读 26,772评论 0 192
• 我被黑心中介骗来泰国打工， 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留，地道东北人。 一个月前我还...
沈念sama阅读 35,448评论 2 269
• 正文 我出身青楼，却偏偏与公主长得像，于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子，可洞房花烛夜当晚...
茶点故事阅读 35,325评论 2 261

### 推荐阅读更多精彩内容

• 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪：刷leetcod...
土汪阅读 12,658评论 0 33
• 1、用C语言实现一个revert函数，它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
希崽家的小哲阅读 6,092评论 0 12
• 我们离得很近，就在对面 愿所有的孩子 每次考试 都满分走出教室
善良点儿有意思点儿阅读 131评论 0 0
• 在我们老家流传着这样一个俗话：“宁可让人可恨，也别让人可怜！”我觉得言外之意就是一个人活着不要装出让人可怜的样子乞...
唐人生阅读 218评论 0 0
• away这个词，怎么看怎么不顺眼朗文的解释是首先away是个副词（adv）不能单独使用，必须和动词搭配使用，表示动...
鸭梨山大哎阅读 515评论 0 1