【蓝桥杯备赛】2013年第四届蓝桥杯省赛真题C++ B组

文章目录

  • 题目结构
  • 填空题
    • 第一题 高斯日记
    • 第二题 马虎的算式
    • 第三题 第39级台阶
  • 代码题
    • 第七题 错误票据
    • 第八题 翻硬币
    • 第九题 带分数

题目结构

项目 题型 分值 题型
第一题 结果填空 3 日期处理
第二题 结果填空 5 模拟
第三题 结果填空 11 dfs
第四题 代码填空 9
第五题 代码填空 13
第六题 结果填空 15
第七题 结果填空 19 模拟计数
第八题 程序设计 21 模拟翻硬币
第九题 程序设计 23 全爱咧
第十题 程序设计 31

填空题

第一题 高斯日记

问题描述
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。
这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113 ,请你算出高斯获得博士学位的年月日。
答案提交
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。

手算的答案是1799-07-16

第二题 马虎的算式

问题描述
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字,能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案提交
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。


因为是填空题,就直接模拟。但要注意的是这五个数完全不一样,条件判断的时候要写十个判断保证他真的不相等。


#include 
using namespace std;
int ans;
int main()
{
    for (int a = 1; a < 10; a++)
    {
        for (int b = 1; b < 10; b++)
        {
            for (int c = 1; c < 10; c++)
            {
                for (int d = 1; d < 10; d++)
                {
                    for (int e = 1; e < 10; e++)
                    {
                        if (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e)
                            if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e))
                                ans++;
                    }
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
} // namespace std;

第三题 第39级台阶

问题描述
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前 的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:如果我每一步只能迈上 1 个或 2 个台阶。
先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。
那么,上完39级台阶,有多少种不同的上法呢? 请你利用计算机的优势,帮助小明寻找答案。
答案提交
要求提交的是一个整数。
注意:不要提交解答过程,或其它的辅助说明文字。


答案:51167078

DFS:

#include 
using namespace std;
int ans;
void dfs(int floor,int cnt){
    if(floor>39) return;
    if(floor==39){
        if(cnt%2==0){
            ans++;
        }
        return;
    }
    dfs(floor+1,cnt+1);
    dfs(floor+2,cnt+1);
}
int main(){
    dfs(0,0);
    cout<<ans<<endl;
    return 0;
}

代码题

第七题 错误票据

问题描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID,假设断号不可能发生在最大和最小号。

输入格式
要求程序首先输入一个整数 N (N < 100)表示后面数据行数。
接着读入 N 行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。
输出格式
要求程序输出 1 行,含两个整数 m n,用空格分隔。
其中,m 表示断号ID,n 表示重号ID

样例输入1
2
5 6 8 11 9
10 12 9

样例输出1
7 9

样例输入2
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

样例输出2
105 120

#include 
using namespace std;
int n,r,l,ans1,ans2;
int cnt[100000];
int main()
{
    cin>>n;
    int x;
    r=0;
    l=0x3f3f3f3f;
    while(cin>>x){
        cnt[x]++;
        r=max(r,x);
        l=min(l,x);
    }
    for(int i=l;i<=r;i++){
        if(cnt[i]==0) ans1=i;
        if(cnt[i]==2) ans2=i;
    }
    cout<<ans1<<" "<<ans2<<endl;
    return 0;
} // namespace std;

第八题 翻硬币

问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:oo*oooo,如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出格式
一个整数,表示最小操作步数

输入样例1

**********
o****o****

1
2
输出样例1
5

输入样例2

*o**o***o***
*o***o**o***

1
2
输出样例2
1

#include 
using namespace std;
int ans;
string a,b;
void turn(int x){
    if(x=='o') a[x]='*';
    else a[x]='o';
}
int main()
{
    cin>>a>>b;
    int len=a.length();
    for(int i=0;i<len;i++){
        if(a[i]!=b[i]){
            turn(i);
            turn(i+1);
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
} // namespace std;

第九题 带分数

问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。

输入格式
一个正整数。

输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。

输入样例1
100

输出样例1
11

输入样例2
105

输出样例2
6

数据范围
1 ≤ N < 106

全排列之后分割成三个数

#include 
#include 
#include 
#include 

using namespace std;

int n, ans;
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int get(int l, int r)
{
    int res = 0;
    for (int i = l; i <= r; i ++) res = res * 10 + a[i];
    
    return res;
}

int main()
{
    cin >> n;
    
    do
    {
        for (int i = 0; i < 6; i ++)
            for (int j = i + 1; j < 8; j ++)
            {
                int a = get(0, i);
                int b = get(i + 1, j);
                int c = get(j + 1, 8);
                
                if (a + 1.0*b / c == n) ans ++;
            }
            
    }while(next_permutation(a, a + 9));
    
    cout << ans << endl;
    return 0;
}

你可能感兴趣的:(蓝桥杯,c++,算法)