2017年蓝桥杯省赛赛前集训题(共14题)
- 格式:docx
- 大小:229.19 KB
- 文档页数:26
第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位(四舍五入),并填写这个小数值。
注意:只填写一个小数,不要写任何多余的符号或说明。
#include
#include
#include using namespace std; int main()
{
double x;
for(x=2;x<=3;x+=1e-7)
{
if (abs(pow(x,x)-10)<1e-6)
cout<
}
return 0;
}
答案:2.506184
其他类似题:ALGO-23一元三次方程求解
第3题(全排列)
注意:
全排列必考!
全排列必考!
全排列必考!
重要的事要说三遍!
白打酒(2014年省赛本科B组第3题)
话说大诗人白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
答案: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)t++;
}
while(next_permutation(p,p+14));//因为最后一次遇到的肯定是花,所以只排前14个数,不排最后一个
cout<
return 0;
}
解法2:交换大法解法
#include
using namespace std;
#define N 14//因为最后一次肯定是花,所以只排14个数
intt;
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)t++;//倒数第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)t++;
}
while(next_permutation(s.begin(),s.end()));
cout<
return 0;
}
解法4:递归解法
#include
using namespace std;
intt=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个人说的是真话
{
for (int i = 0; i < N; i++)
{
if(a[i]) cout<
}
}
}
while(prev_permutation(a,a+N));
return 0;
}
解法3-递归(大材小用了)
#include
using namespace std;
#define N 5
int a[N];//1扶了。0没扶。
void f(int k)
{
int i;
if(k==N)
{
int sum=0;
for(i=0;i
sum+=a[i];
if(sum==1)//只有一个人扶了
{
//ABCDE5个变量存5个人的真假话状态,1为真话,0为假话