2017年蓝桥杯省赛赛前集训题(共14题)

2017年蓝桥杯省赛赛前集训题(共14题)
2017年蓝桥杯省赛赛前集训题(共14题)

2017年蓝桥杯省赛赛前集训题(共14题)

第1题:星系炸弹(2015年省赛C/C++B组第2题)在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

每个炸弹都可以设定多少天之后爆炸。

比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19

请严格按照格式书写。不能出现其它文字或符号。

?结果:2017-08-05

?解决方法:用Excel拖

这个题会了的同学们把上课讲过的,课件上的,其他几道Excel拖动题都做一遍。

第2题:(2015年校内选拔赛C/C++B组第3题)如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?

显然,这个值是介于2和3之间的一个数字。

请把x的值计算到小数后6位(四舍五入),并填写这个小数值。

注意:只填写一个小数,不要写任何多余的符号或说明。

答案:14

解法1:next_permutation的解法

#include

#include

using namespace std;

int main()

{

int p[15]={1,1,1,1,1,2,2,2,2,2,2,2,2,2,2};//1是店,2是花

int sum,cnt=0;

do

{

sum=2;

for(int i=0;i<15;i++)

if(p[i]==1)

sum<<=1;

else if(p[i]==2)

sum--;

if(sum==0) cnt++;

}

while(next_permutation(p,p+14));//因为最后一次遇到的肯定是花,所以只排前14个数,不排最后一个

cout<

return 0;

}

解法2:交换大法解法

#include

using namespace std;

#define N 14//因为最后一次肯定是花,所以只排14个数

int cnt;

bool ok(int p[],int begin,int end)

{

for (int i = begin; i < end; i++)

if (p[i] == p[end])

return false;

return true;

}

void perms(int p[],int start)

{

int i;

if(start==N-1)

int sum=2;

for(i=0;i

if(p[i]==1)

sum<<=1;

else if(p[i]==2)

sum--;

if(sum==1) cnt++;//倒数第2次,剩1斗酒

return;

}

for(i=start;i

{

if (ok(p, start, i))

{

swap(p[start],p[i]);

perms(p,start+1);

swap(p[start],p[i]);

}

}

}

int main()

{

int p[]={1,1,1,1,1,2,2,2,2,2,2,2,2,2};//1是店,2是花

perms(p,0);

cout<

return 0;

}

解法3:字符串全排列的解法

#include

#include

using namespace std;

int main()

{

string s = "aaaaabbbbbbbbb";//a是店,b是花

int sum,cnt=0;

do

{

sum=2;

for(int i=0;i<15;i++)

if(s[i]=='a')

sum<<=1;

else if(s[i]=='b')

sum--;

if(sum==1) cnt++;

while(next_permutation(s.begin(),s.end()));

cout<

return 0;

}

解法4:递归解法

#include

using namespace std;

int cnt=0;

void f(int a,int b,int c)//a个店,b朵花,c升酒

{

if(a>5||b>9) return;

f(a+1,b,c*2);

f(a,b+1,c-1);

if(a==5&&b==9&&c==1)

cnt++;

}

int main()

{

f(0,0,2);

cout<

}

第4题(逻辑推理题)

练习系统ADV-143 扶老奶奶过街

?一共有5个红领巾,编号分别为A、B、C、D、E,老奶奶被他们其中一个扶过了马路。

五个红领巾各自说话:

A :我和E都没有扶老奶奶

B :老奶奶是被C和E其中一个扶过大街的

C :老奶奶是被我和D其中一个扶过大街的

D :B和C都没有扶老奶奶过街

E :我没有扶老奶奶

已知五个红领巾中有且只有2个人说的是真话,请问是谁扶这老奶奶过了街?

若有多个答案,在一行中输出,编号之间用空格隔开

例如

A B C D E(这显然不是正确答案)

解法1--位运算

#include

using namespace std;

#define N 5

int main()

{

int i,j,t,a[N];

for (i = 0x10; i >0; i>>=1)

{

t=i;

for (j = N-1; j >= 0; j--)

{

a[j] = t & 1;

t>>=1;

}

//ABCDE5个变量存5个人的真假话状态,1为真话,0为假话

int A=(a[0]+a[4]==0);//A :我和E都没有扶老奶奶

int B=(a[2]+a[4]==1);//B :老奶奶是被C和E其中一个扶过大街的

int C=(a[2]+a[3]==1);//C :老奶奶是被我和D其中一个扶过大街的

int D=(a[1]+a[2]==0);//D :B和C都没有扶老奶奶过街

int E=(a[4]==0);//E :我没有扶老奶奶

if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话

{

for (j = 0; j < N; j++)

{

if(a[j]) cout<

}

}

}

return 0;

}

解法2-全排列

#include

#include

using namespace std;

#define N 5

int main()

{

int a[N]={1,0,0,0,0};//1扶了。0没扶。

do

{

//ABCDE5个变量存5个人的真假话状态,1为真话,0为假话

int A=(a[0]+a[4]==0);//A :我和E都没有扶老奶奶

int B=(a[2]+a[4]==1);//B :老奶奶是被C和E其中一个扶过大街的

int C=(a[2]+a[3]==1);//C :老奶奶是被我和D其中一个扶过大街的

int D=(a[1]+a[2]==0);//D :B和C都没有扶老奶奶过街

int E=(a[4]==0);//E :我没有扶老奶奶

if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话

{

相关主题
相关文档
最新文档