1.獎券數目
有些人很迷信數字,比如帶“4”的數字,認爲和“死”諧音,就覺得不吉利。
雖然這些說法純屬無稽之談,但有時還要迎合大衆的需求。某抽獎活動的獎券號碼是5位數(10000-99999),要求其中不要出現帶“4”的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。
請提交該數字(一個整數),不要寫任何多餘的內容或說明性文字。
答案:52488
思路:找一下有多少不含4的數即可 。
#include <stdio.h>
int ans;
int ok(int x)
{
while(x)
{
int t=x%10;
x/=10;
if(t==4) return 0;
}
return 1;
}
int main()
{
for(int i=10000;i<=99999;i++)
{
if(ok(i))
ans++;
}
printf("%d",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
請嚴格按照格式書寫。不能出現其它文字或符號。
答案:2017-08-05
思路:計算一下1000天以後的日期即可,注意閏年 。
#include <stdio.h>
int year=2014,month=11,day=9,n=1000;
int book[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int run(int x)
{
if(x%4==0&&x%100!=0||x%400==0)
{
return 1;
}
return 0;
}
void ok()
{
while(n--)
{
day++;
if(month==2)
{
if(run(year))
{
book[2]=29;
}
else
{
book[2]=28;
}
}
if(day>book[month])
{
day=1;
month++;
}
if(month==13)
{
year++;
month=1;
}
}
}
int main()
{
ok();
printf("%d-%d-%d",year,month,day);
return 0;
}
3.三羊獻瑞
觀察下面的加法算式:
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
答案 :1085
思路:此題暴力做是很簡單的 ,我的代碼是生成0~9的全排列,輸出符合條件的情況 ,也可以得到正確的結果 。
#include <stdio.h>
int a[20],b[20];
void dfs(int y) //選了x個數 判斷選不選y
{
if(y==10)
{
int tx=1000*a[0]+100*a[1]+10*a[2]+a[3];
int ty=1000*a[4]+100*a[5]+10*a[6]+a[1];
int tz=10000*a[4]+1000*a[5]+100*a[2]+10*a[1]+a[7];
if(tx+ty==tz&&a[0]&&a[4])
{
printf("%d %d %d %d\n",a[4],a[5],a[6],a[1]);
}
return ;
}
for(int i=0;i<10;i++)
{
if(!b[i])
{
a[y]=i;
b[i]=1;
dfs(y+1);
b[i]=0;
}
}
}
int main()
{
dfs(0);
return 0;
}
由於藍橋杯取消了代碼填空 ,所以兩道代碼填空題我就不寫了
6.加法變乘法
我們都知道:1+2+3+ … + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果爲2015
比如:
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,並把位置靠前的那個乘號左邊的數字提交(對於示例,就是提交10)。
注意:需要你提交的是一個整數,不要填寫任何多餘的內容。
答案:16
思路 :暴力 。枚舉第一個乘號的位置,在枚舉第二個乘號的位置 ,輸出符合條件的情況 。
#include <stdio.h>
int a[50];
int main()
{
for(int i=1;i<=49;i++)
{
a[i]=i;
}
for(int i=1;i<=48;i++)
{
for(int j=i+2;j<=48;j++)
{
int s=0;
for(int k=1;k<=49;k++)
{
if(k==i||k==j)
{
s+=a[k]*a[k+1];
k++;
}
else
{
s+=a[k];
}
}
if(s==2015)
{
printf("%d\n",i);
}
}
}
return 0;
}
7.牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裏突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裏能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多餘的內容或說明文字。
答案 :3598180
思路:剛開始想都沒想,寫了一個dfs ,但是跑了好幾分鐘還沒跑出答案 。所以又換了種思路 ,即每個面值的牌我們有5種選擇 ,選或者不選 ,其中選可以選1~4張 ,還是dfs,這次就快了很多 。
#include <stdio.h>
long long ans;
void dfs(int s,int k) //手中有幾張牌 判斷k面值的牌選不選
{
if(k==14&&s==13)
{
ans++;
}
if(k==14)
{
return ;
}
for(int i=0;i<=4;i++)
{
dfs(s+i,k+1);
}
}
int main ()
{
dfs(0,1);
printf("%lld",ans);
return 0;
}
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
思路:很簡單的一道題,只要我們找出兩個當前樓號所處的橫縱座標,然後便可以計算出最短距離了。
#include <stdio.h>
#include <math.h>
int w,n,m,ans;
int main()
{
scanf("%d%d%d",&w,&n,&m);
int h1=n/w;
int h2=m/w;
int l1=n%w;
int l2=m%w;
if(h1&1)
{
if(!l1) l1=w;
l1=w-l1+1;
}
else if(!h1&1)
{
if(!l1) l1=w;
}
if(h2&1)
{
if(!l2) l2=w;
l2=w-l2+1;
}
else if(!h2&1)
{
if(!l2) l2=w;
}
ans=abs(l1-l2)+abs(h1-h2);
printf("%d",ans);
return 0;
}
9.壘骰子
賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼着會互相排斥!
我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。
atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由於方案數可能過多,請輸出模 10^9 + 7 的結果。
不要小看了 atm 的骰子數量哦~
「輸入格式」
第一行兩個整數 n m
n表示骰子數目
接下來 m 行,每行兩個整數 a b ,表示 a 和 b 數字不能緊貼在一起。
「輸出格式」
一行一個數,表示答案模 10^9 + 7 的結果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「數據範圍」
對於 30% 的數據:n <= 5
對於 60% 的數據:n <= 100
對於 100% 的數據:0 < n <= 10^9, m <= 36
資源約定:
峯值內存消耗 < 256M
CPU消耗 < 2000ms
思路:通過讀題 ,我們發現 ,第i層的方案數 ,只與第i-1層有關 ,那麼是不是可以用動態規劃來做呢?可以做,但是還不夠快 ,會超時(因爲題目給的數據範圍是1e9,想想用dp做的時間複雜度) 。在這裏我們採用矩陣快速冪的做法 ,我們初始化一個e矩陣 ,其中e[i]表示一個骰子的時候i數字朝上放置有幾種情況 。我們另外初始化一個矩陣a來儲存兩個數字之間是否衝突,實際情況就類似於下圖。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
long long mod=1e9+7,n,m,ans;
long long a[7][7],e[7],b[7]={0,4,5,6,1,2,3};
void kkk()
{
long long t[7]={0};
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
t[i]+=(a[i][j]%mod)*(e[j]%mod)%mod;
}
}
for(int i=1;i<=6;i++)
{
e[i]=t[i]%mod;
}
}
void kke()
{
long long t[7][7]={0};
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++)
{
t[i][j]+=(a[i][k]%mod)*(a[k][j]%mod)%mod;
}
}
}
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
a[i][j]=t[i][j]%mod;
}
}
}
int main()
{
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
a[i][j]=1;
e[i]=1;
}
}
scanf("%lld%lld",&n,&m);
for(int i=0;i<m;i++)
{
long long t1,t2;
scanf("%lld%lld",&t1,&t2);
a[t1][b[t2]]=0;
a[t2][b[t1]]=0;
}
long long t=n-1;
while(t)
{
if(t&1) kkk();
kke();
t>>=1;
}
for(int i=1;i<=6;i++)
{
ans=(ans+e[i])%mod;
}
t=n;
long long s=1;
long long tt=4;
while(t)
{
if(t&1) s=s*tt%mod;
tt=tt*tt%mod;
t>>=1;
}
printf("%lld",ans*s%mod);
return 0;
}
生命之樹
在X森林裏,上帝創建了生命之樹。
他給每棵樹的每個節點(葉子也稱爲一個節點)上,都標了一個整數,代表這個點的和諧值。
上帝要在這棵樹內選出一個非空節點集S,使得對於S中的任意兩個點a,b,都存在一個點列 {a, v1, v2, …, vk, b} 使得這個點列中的每個點都是S裏面的元素,且序列中相鄰兩個點間有一條邊相連。
在這個前提下,上帝要使得S中的點所對應的整數的和儘量大。
這個最大的和就是上帝給生命之樹的評分。
經過atm的努力,他已經知道了上帝給每棵樹上每個節點上的整數。但是由於 atm 不擅長計算,他不知道怎樣有效的求評分。他需要你爲他寫一個程序來計算一棵樹的分數。
「輸入格式」
第一行一個整數 n 表示這棵樹有 n 個節點。
第二行 n 個整數,依次表示每個節點的評分。
接下來 n-1 行,每行 2 個整數 u, v,表示存在一條 u 到 v 的邊。由於這是一棵樹,所以是不存在環的。
「輸出格式」
輸出一行一個數,表示上帝給這棵樹的分數。
「樣例輸入」
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5
「樣例輸出」
8
「數據範圍」
對於 30% 的數據,n <= 10
對於 100% 的數據,0 < n <= 10^5, 每個節點的評分的絕對值不超過 10^6 。
資源約定:
峯值內存消耗 < 256M
CPU消耗 < 3000ms
————————————————
思路:樹形dp , 這題我不會。。。。。。。