您的位置:首页 > 其它

2012年第三届蓝桥杯预赛详细解题报告

2015-04-09 20:00 211 查看
假设有两种微生物 X 和 Y

X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。

现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。

如果X=10,Y=90 呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!

//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved

#include<iostream>
using namespace std;
int main() {
int x = 10, y = 90;
for(int i = 1; i<=60; i++) {
y -= x;
if(i%2 == 0) y *= 2;
if(i%3 == 0) x *= 2;
}
if(y<0) y=0;
cout<<y<<endl;
return 0;
}


第二题很简单的暴力破解
//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved

#include<iostream>
using namespace std;
int function1(int n) {
int sum=0;
while(n) {
sum = sum * 10 + n%10;
n /= 10;
}
return sum;
}
int main() {
for(int i=12345; i<=98765; i++) {
for (int k=2; k<=9; k++) {
if(i * k == function1(i))
{
cout<<i<<endl;
break;
}
}
}

return 0;
}


有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。

等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

如果有多个可能的答案,请列出所有答案,每个答案占一行。

格式是:人数,人数,...

例如,有一种可能是:20,5,4,2,0

//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved

#include<iostream>
using namespace std;
int main() {
int a, b, c, d;
for(a = 4; a <= 20; a++)
for(b = a-1; b >= 3; b--)
for(c = b-1; c>=2; c--)
for(d = c-1; d>=1; d--) {
if(1.0/a+1.0/b+1.0/c+1.0/d == 1.0)
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<"0"<<endl;
}
return 0;
}


某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

每位选手都有一个起步的分数为10分。

某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

你的任务是算出所有可能情况。每个答案占一行。

//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved

#include<iostream>
using namespace std;
void function1(char s[], int n, int score) {
if(n == 0) {
if(score == 10)
puts(s);
return ;
}
s[n-1] = '0';
function1(s,n-1, score+n);
if (score%2 == 0) {
s[n-1] = '1';
function1(s,n-1,score/2);
}
}
int main() {
char s[10];
s[10] ='\0';
function1(s,10,100);
return 0;
}


这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。

变换的过程如下:

第一步. 把字符串6个一组折叠起来,比如wangximing则变为:

wangxi

ming

第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:

202 220 206 120 105

第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3

上面的数字缩位后变为:344836, 这就是程序最终的输出结果!

要求程序从标准输入接收数据,在标准输出上输出结果。

输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。

输出格式为:n行变换后的6位密码。
//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved

#include <iostream>
#include <string.h>
using namespace std;
int main() {
char str[100],n;
cin>>n;
while(n--) {
int a[6]={0},k;
cin>>str;
for (k=0;k<6;k++) {
for(int i=0; i<strlen(str); i++){
if(i%6 == k)
a[k] += str[i];
}
}
for (int i=0;i<6 ; i++) {
while (a[i]>10) {
int temp=0;
while (a[i]>0) {
temp += a[i]%10;
a[i] /= 10;
}
a[i] = temp;
}
}
for (int j=0; j<6; j++) {
cout<<a[j];
}
cout<<endl;
}
return 0;
}
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

我们约定:

每个人从盒子中取出的球的数目必须是:1,3,7或者8个。

轮到某一方取球时不能弃权!

A先取球,然后双方交替取球,直到取完。

被迫拿到最后一个球的一方为负方(输方)

请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?

程序运行时,从标准输入获得数据,其格式如下:

先是一个整数n(n<100),表示接下来有n个整数。然后是n个整数,每个占一行(整数<10000),表示初始球数。

程序则输出n行,表示A的输赢情况(输为0,赢为1)。

//
//  main.cpp
//  Test
//
//  Created by JYH on 15/3/25.
//  Copyright (c) 2015年 JYH. All rights reserved
#include <iostream>
using namespace std;
int main() {
int a[100001] = {0};
int i, j, b[4]={1, 3, 7,8};
for(i=1; i<=10000; i++) {
if(a[i]==0) {
for(j=0;j<4;j++) {
a[i+b[j]] = 1;
}
}
}
int n,ans;
cin>>n;
for(int k=0;k<n;k++) {
cin>>ans;
cout<<a[ans]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: