1. 程式人生 > 實用技巧 >藍橋杯 第五屆

藍橋杯 第五屆

1.

獎券數目

有些人很迷信數字,比如帶“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;
} 
2.

星系炸彈

在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;
}

3.


三羊獻瑞

觀察下面的加法算式:

祥 瑞 生 輝
+ 三 羊 獻 瑞
-------------------
三 羊 生 瑞 氣

(如果有對齊問題,可以參看【圖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;
}

6.


加法變乘法

我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015

比如:
1+2+3+...+10*11+12+...+27*28+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;
}

7.

牌型種數

小明被劫持到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;
}

8.

移動距離

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 <xxx>, 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

#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;
}