2017年蓝桥杯省赛赛前集训题(共14题)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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