第六屆藍橋杯B組

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 , 這題我不會。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章