蓝桥杯省赛赛前集训题共14题.docx
- 文档编号:3669367
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:37
- 大小:190.92KB
蓝桥杯省赛赛前集训题共14题.docx
《蓝桥杯省赛赛前集训题共14题.docx》由会员分享,可在线阅读,更多相关《蓝桥杯省赛赛前集训题共14题.docx(37页珍藏版)》请在冰豆网上搜索。
蓝桥杯省赛赛前集训题共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位(四舍五入),并填写这个小数值。
注意:
只填写一个小数,不要写任何多余的符号或说明。
#include
#include
#include
usingnamespacestd;
intmain()
{
doublex;
for(x=2;x<=3;x+=1e-7)
{
if(abs(pow(x,x)-10)<1e-6)
cout< } return0; } 答案: 2.506184 其他类似题: ALGO-23一元三次方程求解 第3题(全排列) 注意: 全排列必考! 全排列必考! 全排列必考! 重要的事要说三遍! 白打酒(2014年省赛本科B组第3题) 话说大诗人白,一生好饮。 幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。 他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算白遇到店和花的次序,可以把遇店记为a,遇花记为b。 则: babaabbabbabbbb就是合理的次序。 像这样的答案一共有多少呢? 请你计算出所有可能方案的个数(包含题目给出的)。 答案: 14 解法1: next_permutation的解法 #include #include usingnamespacestd; intmain() { intp[15]={1,1,1,1,1,2,2,2,2,2,2,2,2,2,2};//1是店,2是花 intsum,cnt=0; do { sum=2; for(inti=0;i<15;i++) if(p[i]==1) sum<<=1; elseif(p[i]==2) sum--; if(sum==0)t++; } while(next_permutation(p,p+14));//因为最后一次遇到的肯定是花,所以只排前14个数,不排最后一个 cout< return0; } 解法2: 交换大法解法 #include usingnamespacestd; #defineN14//因为最后一次肯定是花,所以只排14个数 intt; boolok(intp[],intbegin,intend) { for(inti=begin;i if(p[i]==p[end]) returnfalse; returntrue; } voidperms(intp[],intstart) { inti; if(start==N-1) { intsum=2; for(i=0;i if(p[i]==1) sum<<=1; elseif(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]); } } } intmain() { intp[]={1,1,1,1,1,2,2,2,2,2,2,2,2,2};//1是店,2是花 perms(p,0); cout< return0; } 解法3: 字符串全排列的解法 #include #include usingnamespacestd; intmain() { strings="aaaaabbbbbbbbb";//a是店,b是花 intsum,cnt=0; do { sum=2; for(inti=0;i<15;i++) if(s[i]=='a') sum<<=1; elseif(s[i]=='b') sum--; if(sum==1)t++; } while(next_permutation(s.begin(),s.end())); cout< return0; } 解法4: 递归解法 #include usingnamespacestd; intt=0; voidf(inta,intb,intc)//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++; } intmain() { 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个人说的是真话,请问是谁扶这老奶奶过了街? 若有多个答案,在一行中输出,编号之间用空格隔开 例如 ABCDE(这显然不是正确答案) 解法1--位运算 #include usingnamespacestd; #defineN5 intmain() { inti,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为假话 intA=(a[0]+a[4]==0);//A: 我和E都没有扶老奶奶 intB=(a[2]+a[4]==1);//B: 老奶奶是被C和E其中一个扶过大街的 intC=(a[2]+a[3]==1);//C: 老奶奶是被我和D其中一个扶过大街的 intD=(a[1]+a[2]==0);//D: B和C都没有扶老奶奶过街 intE=(a[4]==0);//E: 我没有扶老奶奶 if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话 { for(j=0;j { if(a[j])cout< } } } return0; } 解法2-全排列 #include #include usingnamespacestd; #defineN5 intmain() { inta[N]={1,0,0,0,0};//1扶了。 0没扶。 do { //ABCDE5个变量存5个人的真假话状态,1为真话,0为假话 intA=(a[0]+a[4]==0);//A: 我和E都没有扶老奶奶 intB=(a[2]+a[4]==1);//B: 老奶奶是被C和E其中一个扶过大街的 intC=(a[2]+a[3]==1);//C: 老奶奶是被我和D其中一个扶过大街的 intD=(a[1]+a[2]==0);//D: B和C都没有扶老奶奶过街 intE=(a[4]==0);//E: 我没有扶老奶奶 if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话 { for(inti=0;i { if(a[i])cout< } } } while(prev_permutation(a,a+N)); return0; } 解法3-递归(大材小用了) #include usingnamespacestd; #defineN5 inta[N];//1扶了。 0没扶。 voidf(intk) { inti; if(k==N) { intsum=0; for(i=0;i sum+=a[i]; if(sum==1)//只有一个人扶了 { //ABCDE5个变量存5个人的真假话状态,1为真话,0为假话 intA=(a[0]+a[4]==0);//A: 我和E都没有扶老奶奶 intB=(a[2]+a[4]==1);//B: 老奶奶是被C和E其中一个扶过大街的 intC=(a[2]+a[3]==1);//C: 老奶奶是被我和D其中一个扶过大街的 intD=(a[1]+a[2]==0);//D: B和C都没有扶老奶奶过街 intE=(a[4]==0);//E: 我没有扶老奶奶 if(A+B+C+D+E==2)//5个人有且只有2个人说的是真话 { for(i=0;i { if(a[i])cout< } } } return; } for(i=1;i>=0;i--) { a[k]=i; f(k+1); } } intmain() { f(0); return0; } 第5题: 牌型种数(2015年省赛C/C++B组第7题) •小明被劫持到X赌城,被迫与其他3人玩牌。 •一副扑克牌(去掉大小王牌,共52),均匀发给4个人,每个人13。 •这时,小明脑子里突然冒出一个问题: •如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢? 答案: 3598180 • 解法1: 暴力法,比较慢,5秒左右出答案,但不容易出错 #include usingnamespacestd; intmain() { inta1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13;//13种点数 intt=0; for(a1=0;a1<=4;a1++) for(a2=0;a2<=4;a2++) for(a3=0;a3<=4;a3++) for(a4=0;a4<=4;a4++) for(a5=0;a5<=4;a5++) for(a6=0;a6<=4;a6++) for(a7=0;a7<=4;a7++) for(a8=0;a8<=4;a8++) for(a9=0;a9<=4;a9++) for(a10=0;a10<=4;a10++) for(a11=0;a11<=4;a11++) for(a12=0;a12<=4;a12++) for(a13=0;a13<=4;a13++) { if(a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13==13) cnt++; } cout< return0; } 解法2: DFS+剪枝,秒杀 #include usingnamespacestd; intt=0; voidf(intsum,intn) { inti; if(sum>13||(13-n)*4+sum<13||n>13)return;//剪枝 if(sum==13) { cnt++; return; } for(i=0;i<=4;i++) { f(sum+i,n+1); } } intmain() { f(0,0); cout< return0; } 第6题: 单位分数(组合问题) (2015年校选拔赛C/C++B组第6题) •形如: 1/a的分数称为单位分数。 •可以把1分解为若干个互不相同的单位分数之和。 •例如: •1=1/2+1/3+1/9+1/18 •1=1/2+1/3+1/10+1/15 •1=1/3+1/5+1/7+1/9+1/11+1/15+1/35+1/45+1/231 •等等,类似这样的分解无穷无尽。 •我们增加一个约束条件: 最大的分母必须不超过30 •请你求出分解为n项时的所有不同分解法。 •数据格式要求: •输入一个整数n,表示要分解为n项(n<12) •输出分解后的单位分数项,中间用一个空格分开。 •每种分解法占用一行,行间的顺序按照分母从小到大排序。 •例如, •输入: •4 •程序应该输出: •1/21/31/81/24 •1/21/31/91/18 •1/21/31/101/15 •1/21/41/51/20 •1/21/41/61/12 •再例如, •输入: •5 •程序应该输出: •1/21/31/121/211/28 •1/21/41/61/211/28 •1/21/41/71/141/28 •1/21/41/81/121/24 •1/21/41/91/121/18 •1/21/41/101/121/15 •1/21/51/61/121/20 •1/31/41/51/61/20 •资源约定: •峰值存消耗<256M •CPU消耗<2000ms 题目分析: 题目有点坑。 题意说不超过30,那理应可以等于30的,但是当n=5时,1/21/31/121/201/30也应该是正确的。 可是…,题目给的答案却没有这个解,所以,不能等于30 注意一定要剪枝,不剪的话会超过2000ms,剪枝之后大约428ms #include #include usingnamespacestd; inta[11];//n<12 intn; voidC(intbegin,intm,doublesum)//从begin开始,选n个数中的第m个,已选出的数的和是sum { inti; if(m { return; } if(m==n) { if(abs(sum-1)<1e-9) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯省赛 赛前 集训 14