蓝桥杯 第五届

奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

#include<iostream>
using namespace std;
int main(){
   	int ans=0;
   	for(int i=1;i<=9;i++){
   		if(i==4) continue;
   		for(int j=0;j<=9;j++){
   			if(j==4) continue;
   			for(int k=0;k<=9;k++){
   				if(k==4) continue;
   			  for(int l=0;l<=9;l++){
   			  	if(l==4) continue;
   			    for(int o=0;o<=9;o++){
   			    	if(o==4) continue;
   			    	ans++;
   			    }
   		      }
   		   }
   		}
   	}
   	cout<<ans;
   	return 0;
} 

星系炸弹

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。

#include<iostream>
using namespace std;
int main(){
int y=2014,m=11,d=9;
for(int i=1;i<=1000;i++){
d++;
if((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d==32) {
m++;
d=1;
}
if((m==4||m==6||m==9||m==11)&&d==31){
m++;
d=1;
}
if(m==2&&y==2016&&d==30){
m++;d=1;
}
if(m==2&&y!=2016&&d==29){
m++;
d=1;
}
if(m==13){
y++;
m=1;
}
}
cout<<y<<"-"<<m<<"-"<<d;
return 0;
}

三羊献瑞

观察下面的加法算式:

祥 瑞 生 辉

  • 三 羊 献 瑞

三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

#include<iostream>
using namespace std;
int main(){ 
for(int i=1;i<=9;i++){
for(int j=0;j<=9;j++){
if(j==i) continue;
for(int k=0;k<=9;k++){
if(k==i||k==j) continue;
for(int l=0;l<=9;l++){
if(l==i||l==j||l==k) continue;
for(int o=1;o<=9;o++){
if(o==i||o==j||o==k||o==l) continue;
for(int a=0;a<=9;a++){
if(a==i||a==j||a==k||a==l||a==o) continue;
for(int b=0;b<=9;b++){
if(b==i||b==j||b==k||b==l||b==o||b==a) continue;
for(int c=0;c<=9;c++){
if(c==i||c==j||c==k||c==l||c==o||c==a||c==b) continue;

if((i*1000+j*100+k*10+l)+(o*1000+a*100+b*10+j)==(o*10000+a*1000+k*100+j*10+c)) 
cout<<o<<a<<b<<j<<endl;


}
}
}
}
}
}
}
}
return 0;
}

加法变乘法

我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:
1+2+3+...+1011+12+...+2728+29+...+49 = 2015
就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。

#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=46;i++){
for(int j=i+1;j<=48;j++)
{
if(i*(i+1)-(i+i+1)+j*(j+1)-(j+j+1)==2015-1225)
cout<<i<<" "<<j<<endl;
}
}
return 0;
}

牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

#include<iostream>
using namespace std;
int ans;
void f(int k,int cnt){
if(k>13||cnt>13) return;
if(k==13&&cnt==13) {
ans++;
return;
}
for(int i=0;i<5;i++)
f(k+1,cnt+i);
}
int main(){
f(0,0);
cout<<ans;
}

移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 .....

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。

例如:
用户输入:
6 8 2
则,程序应该输出:
4

再例如:
用户输入:
4 7 20
则,程序应该输出:
5

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int w,m,n;
cin>>w>>m>>n;
int rm,rn,cm,cn;
rm=m%w==0?m/w:m/w+1;
rn=n%w==0?n/w:n/w+1;
if(rm%2==0) cm=rm*w-m+1;//偶数行 
else cm=w-(rm*w-m);//奇数行 
if(rn%2==0) cn=rn*w-n+1;
else cn=w-(rn*w-n);
cout<<abs(cm-cn)+abs(rm-rn);
return 0;
}
posted @ 2020-10-10 22:08  0x3fffffff  阅读(124)  评论(0编辑  收藏  举报