2018年藍橋杯A組C/C++決賽題目


2018年藍橋杯A組C/C++決賽題目

2018年藍橋杯A組C/C++決賽題解

 
 

1:三角形面積

已知三角形三個頂點在直角坐標系下的坐標分別為:
(2.3, 2.5)
(6.4, 3.1)
(5.1, 7.2)

求該三角形的面積。

注意,要提交的是一個小數形式表示的浮點數。
要求精確到小數后3位,如不足3位,需要補零。

 
 

2:閱兵方陣

x國要參加同盟閱兵活動。
主辦方要求每個加盟國派出的士兵恰好能組成 2 個方陣。
x國發現弱小的 y國派出了130人的隊伍,他們的士兵在行進中可以變換2種隊形:
130 = 81 + 49 = 9^2 + 7^2
130 = 121 + 9 = 11^2 + 3^2

x國君很受刺激,覺得x國面積是y國的6倍,理應變出更多隊形。
於是他發號施令:
我們要派出一支隊伍,在行進中要變出 12 種隊形!!!

手下人可慘了,要忙着計算至少多少人才能組成 12 種不同的雙方陣。
請你利用計算機的優勢來計算一下,至少需要多少士兵。

(ps: 不要失去信心,1105人就能組成4種隊形了)

注意,需要提交的是一個整數,表示至少需要士兵數目,不要填寫任何多余的內容。
 
 

3:找假幣

在8枚硬幣中,有1枚假幣,假幣外觀與真幣一模一樣,只是重量略輕或略重一點。
給你一架天平,要求最多稱3次,就找出假幣,並且知道它是重一些還是輕一些。
下面的代碼給出一個解決方案,仔細分析邏輯,填寫划線位置缺少的代碼。

#include <stdio.h>

int balance(int a, int b)
{
	if(a<b) return -1;
	if(a>b) return 1;
	return 0;
}

void judge(char* data, int a, int b, int std)
{
	switch(balance(data[a],data[std])){
	case -1:
		printf("%d light\n", a);
		break;
	case 0:
		printf("%d heavy\n", b);
		break;
	case 1:
		printf("err!\n", b);
	}
}

// data 中8個元素,有一個假幣,或輕或重
void f(char* data)
{
	switch( ____________________________________ ){  // 填空
	case -1:
		switch(balance(data[0]+data[4],data[3]+data[1])){
			case -1:
				judge(data,0,3,1);
				break;
			case 0:
				judge(data,2,5,0);
				break;
			case 1:
				judge(data,1,4,0);
		}
		break;
	case 0:
		judge(data,6,7,0);		
		break;
	case 1:
		switch(balance(data[0]+data[4],data[3]+data[1])){
			case -1:
				judge(data,4,1,0);
				break;
			case 0:
				judge(data,5,2,0);
				break;
			case 1:
				judge(data,3,0,1);
		}
		break;		
	}	
}

int main()
{
	int n;
	char buf[100];
	
	scanf("%d", &n);
	gets(buf);
	
	int i;
	for(i=0; i<n; i++){
		gets(buf);
		f(buf);
	}
	
	return 0;
}

 
 

4:約瑟夫環

n 個人的編號是 1~n,如果他們依編號按順時針排成一個圓圈,從編號是1的人開始順時針報數。
(報數是從1報起)當報到 k 的時候,這個人就退出游戲圈。下一個人重新從1開始報數。
求最后剩下的人的編號。這就是著名的約瑟夫環問題。

本題目就是已知 n,k 的情況下,求最后剩下的人的編號。

題目的輸入是一行,2個空格分開的整數n, k
要求輸出一個整數,表示最后剩下的人的編號。

約定:0 < n,k < 1百萬

例如輸入:
10 3

程序應該輸出:
4

 
 

5:自描述序列

小明在研究一個序列,叫Golomb自描述序列,不妨將其記作{G(n)}。這個序列有2個很有趣的性質:

  1. 對於任意正整數n,n在整個序列中恰好出現G(n)次。
  2. 這個序列是不下降的。

以下是{G(n)}的前幾項:

n 1 2 3 4 5 6 7 8 9 10 11 12 13
G(n) 1 2 2 3 3 4 4 4 5 5 5 6 6

給定一個整數n,你能幫小明算出G(n)的值嗎?

輸入

一個整數n。

對於30%的數據,1 <= n <= 1000000
對於70%的數據,1 <= n <= 1000000000
對於100%的數據,1 <= n <= 2000000000000000

輸出

一個整數G(n)

【樣例輸入】
13

【樣例輸出】
6

 
 

6:采油

LQ公司是世界著名的石油公司,為世界供應優質石油。
最近,LQ公司又在森林里發現了一大片區域的油田,可以在這個油田中開采n個油井。
LQ公司在這n個油井之間修建了n-1條道路,每條道路連接兩個油井,路徑中間不會路過任何油井,而且這些道路將所有油井連通。
建立油井的時候需要使用一台大型設備,運輸起來非常麻煩,LQ公司准備在其中的一個油井位置建立一個空運站,先將設備空運到空運站,之后每次經過他們建立的道路來運輸這個大型設備以建立不同的油井,當油井建立完畢后再從空運站將大型設備運走。
為了減少運輸的麻煩,公司要求大型設備在道路上運輸的總路程是最短的。

在建立油井和采油的過程中需要花費一些人力,第i個油井需要花費Bi個人,而一旦油井建成,就需要Si個人一直堅守在油井上進行維護。
當然,如果一個人參與了油井的建設,他可以直接留下來維護油井,或者參與下一個油井的建設,但是在維護油井的人不能再參加后續油井的建設了。

現在LQ公司想知道,大型設備運輸的總路徑長度最短是多少?在保證總路徑長度最短的情況下,LQ公司至少需要花費多少人力才能完成所有油井的建立與維護。

【輸入格式】
  輸入的第一行包含一個整數n,表示油井的數量。油井由1到n依次標號。
  第二行包含n個整數,依次表示B1, B2, …, Bn,相鄰的整數之間用一個空格分隔。
  第三行包含n個整數,依次表示S1, S2, …, Sn,相鄰的整數之間用一個空格分隔。
  接下來n-1行描述油井之間的道路,其中的第i行包含兩個整數a,b,用一個空格分隔,表示一條道路的起點為i+1、終點為a,長度為b,道路是雙向的,設備可以從任意一端運送到另一端,每條道路都可以經過任意多次。數據保證任意兩個油井之間都可以通過道路連接。

【輸出格式】
  輸出包含兩個整數,用一個空格分隔,表示最優情況下大型設備需要運輸的總路程,以及在總路程最短的情況下最少需要花費的人力數量。

【樣例輸入】
2
10 20
15 15
1 8

【樣例輸出】
16 30

【樣例說明】
  有兩種方案達到最優。
  方案一:在油井2建立空運站,先建立油井2,再將大型設備運輸到油井1建立油井1,最后將大型設備運回油井2。
  方案二:在油井1建立空運站,先將大型設備運輸到油井2建立油井2,再將大型設備運送到油井1建立油井1。

【樣例輸入】
6
3 10 20 7 15 9
2 6 10 4 8 7
1 9
1 2
2 5
3 4
3 7

【樣例輸出】
54 38

【數據規模和約定】
  對於20%的數據:n不超過10;
  另外20%的數據:每個油井最多和兩個油井之間有道路直接連接;
  另外10%的數據:有n-1個油井只有一條道路與其他油井連接;
  對於100%的數據:n不超過100000,B、S、c均為不超過10000的正整數。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM