1. 程式人生 > >16年第七屆藍橋杯 c/c++ b組 題解

16年第七屆藍橋杯 c/c++ b組 題解

1. 煤球數目  答案:171700

#include <cstdio>

int N = 100, sum1 = 0;

int solve(int x) {
	int sum2 = 0;
	for(int i=1; i<=x; i++)
		sum2 += i;
	return sum2;
}

int main() {
	for(int i=1; i<=N; i++) {
		sum1 += solve(i);
	}
	printf("%d",sum1);
	return 0;
}

2. 生日蠟燭  答案:26

#include <cstdio>

bool isOk(int x){
	int sum = 0;
	for(int i=x; i<100; i++) {
		sum += i;
		if(sum == 236) return true;
	}
	return false;
}

int main() {
	for(int i=0; i<100; i++) {
		if(isOk(i)) {
			printf("%d",i);
			return 0;
		}
	}
	return 0;
}

3. 湊算式 答案:29

#include <cstdio>
#include <cmath>

double number[10];
int sum = 0;
bool vis[10];

void DFS(int index) {
	if(index == 9) {
		if(fabs(number[0] + number[1] / number[2] + 
		(number[3] * 100 + number[4] * 10 + number[5]) / 
		(number[6] * 100 + number[7] * 10 + number[8]) - 10.0 )<= 1e-5) {
			sum++;
			return;
		} else {
			return;
		}	
		
	}
	for(int i=1; i<=9; i++) {
		if(vis[i] == false) {
			vis[i] = true;
			number[index] = (double)i;
			DFS(index+1);
			vis[i] = false;
		}
	}	
}

int main() {
	DFS(0);
	printf("%d",sum);
	return 0;
}

4. 快排

5. 抽籤 答案:f(a,k+1,m-i,b);  或 f(a,k+1,m-j,b);

#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024

void f(int a[], int k, int m, char b[]) {
	int i,j;
	if(k==N) { 
		b[M] = 0;
		if(m==0) printf("%s\n",b);
		return;
	}
	for(i=0; i<=a[k]; i++) {
		for(j=0; j<i; j++) b[M-m+j] = k+'A';
		f(a,k+1,m-i,b);  //f(a,k+1,m-j,b);
	}
}
int main() {	
	int  a[N] = {4,2,2,1,1,3};
	char b[BUF];
	f(a,0,M,b);
	return 0;
}

6. 方格填數 答案:1580


#include <cstdio>
#include <cmath>

int sum = 0, number[10];  //
bool vis[10];

bool isOk() {
	if(	abs(number[0]-number[1]) == 1 || 
		abs(number[0]-number[3]) == 1 || 
		abs(number[0]-number[4]) == 1 || 
		abs(number[0]-number[5]) == 1
	) return false;
	if(	abs(number[1]-number[2]) == 1 || 
		abs(number[1]-number[4]) == 1 || 
		abs(number[1]-number[5]) == 1 || 
		abs(number[1]-number[6]) == 1
	) return false;
	if(	abs(number[2]-number[5]) == 1 || 
		abs(number[2]-number[6]) == 1
	) return false;
	if(	abs(number[3]-number[4]) == 1 || 
		abs(number[3]-number[7]) == 1 || 
		abs(number[3]-number[8]) == 1
	) return false;
	if(	abs(number[4]-number[5]) == 1 || 
		abs(number[4]-number[7]) == 1 || 
		abs(number[4]-number[8]) == 1 || 
		abs(number[4]-number[9]) == 1
	) return false;
	if(	abs(number[5]-number[6]) == 1 || 
		abs(number[5]-number[8]) == 1 || 
		abs(number[5]-number[9]) == 1
	) return false;
	if(	abs(number[6]-number[9]) == 1) return false;
	if(	abs(number[7]-number[8]) == 1) return false;
	if(	abs(number[8]-number[9]) == 1) return false;
	return true;
}

void DFS(int index) {
	if(index == 10) { 
		if(isOk()) sum++;
		return;
	}
	for(int i=0; i<=9; i++) {
		if(!vis[i]) {
			vis[i] = true;
			number[index] = i;
			DFS(index+1);
			vis[i] = false;
		}
	}
}
int main() {	
	DFS(0);
	printf("%d",sum);
	
	return 0;
}

7. 剪郵票 答案:116

#include <cstdio>
#include <algorithm>
using namespace std;

int sum = 0, number[20], sum2 = 0;
bool vis[20], vis2[20], flag = false;

bool isExist(int x) {
	for(int i=0; i<5; i++) {
		if(number[i] == x) return true;
	}
	return false;
}

void print() {
	for(int i=0; i<5; i++) {
		printf("%d ",number[i]);
	}
	printf("\n");
}

void isOk(int x) {
	if(!isExist(x)) return;
	if(sum2 == 5) {
		flag = true;
		return;
	}
	if(vis2[x]) return;
	sum2++;
	vis2[x] = true;
	switch(x) {
		case 1 :
			isOk(2);
			isOk(5);
			break;  //////////////
		case 2 :
			isOk(1);
			isOk(6);
			isOk(3);
			break;
		case 3 :
			isOk(2);
			isOk(4);
			isOk(7);
			break;
		case 4 :
			isOk(3);
			isOk(8);
			break;
		case 5 :
			isOk(1);
			isOk(6);
			isOk(9);
			break;
		case 6 :
			isOk(2);
			isOk(5);
			isOk(7);
			isOk(10);
			break;
		case 7 :
			isOk(3);
			isOk(6);
			isOk(8);
			isOk(11);
			break;
		case 8 :
			isOk(4);
			isOk(7);
			isOk(12);
			break;
		case 9 :
			isOk(5);
			isOk(10);
			break;
		case 10 :
			isOk(6);
			isOk(9);
			isOk(11);
			break;
		case 11 :
			isOk(7);
			isOk(10);
			isOk(12);
			break;
		case 12 :
			isOk(8);
			isOk(11);
			break;
		default:break;  
	}
	//vis2[x] = false;  ////////////
}

void DFS(int index) {
	if(index == 5) {
		flag = false;
		sum2 = 0;
		fill(vis2,vis2+20,false);
		isOk(number[0]);
		if(flag) {
			sum++;	
			print();	
		}
		return;
	}
	for(int i=1; i<=12; i++) {
		if(!vis[i] && i>number[index-1]) {
			vis[i] = true;
			number[index] = i;
			DFS(index+1);
			vis[i] = false;
		}
	}
}

int main() {
	DFS(0);
	printf("%d",sum);
	
	return 0;
}

8. 四平方和

#include <cstdio>
#include <cmath>
using namespace std;

int n, n_sqrt, number[4], flag = 0, ok[100000000];

void DFS(int index) {
	if(flag == 1) return;
	if(index == 2) {
		int x = n - number[0] * number[0] - number[1] * number[1];
		if(ok[x] == 0) return;
	}
	if(index == 3) {
		int x = n - number[0] * number[0] - number[1] * number[1] - number[2] * number[2];
		double x2 = sqrt(x);
		if(x2 == (int)x2) {
			number[3] = (int)x2;
			for(int i=0; i<4; i++) {
				printf("%d ",number[i]);
				flag = 1;				
			}
		}
		return;
	}
	for(int j=0; j<=n_sqrt; j++) {
		number[index] = j;
		DFS(index+1);
	}
}

int main() {
	scanf("%d",&n);
	n_sqrt = sqrt(n);
	for(int i=0; i<=n_sqrt; i++) {
		for(int j=0; j<=n_sqrt; j++) {
			ok[i*i + j*j] = 1; 
		}
	}
	DFS(0);

	return 0;
}

9. 交換瓶子

//最少交換 
#include <cstdio>
const int MAXN = 10010;

int N, index = 1, number[MAXN], sum = 0, pos[MAXN];

void swap(int &a, int &b) {  ////引用 
	int temp = a;
	a = b;
	b = temp;
}

int main() {
	scanf("%d",&N);
	for(int i=1; i<=N; i++) {
		int x;
		scanf("%d",&x);
		number[i] = x;
		pos[x] = i;  ////////記錄位置,避免for查詢 
	}
	for(int i=index; i<=N; i++) {
		if(i != number[i]) {
			index = i + 1;
			//swap(number[index], number[findTheIndex(index)]); 此句被優化: 
			int u = number[i], v = number[pos[i]];
			swap(number[i], number[pos[i]]);
				//此處貪心: 
				//用不在原位的數的下標(即:被選中的i)尋找要交換的數(即:number[pos[i]]),
				//保證了for(int i=index; i<=N; i++)在正向遍歷的過程中不回頭,以減少時間複雜度 
			swap(pos[u], pos[v]);
			sum++;
		}
	}
	printf("%d",sum);
	
	return 0;
}
之前做過的PATA上的固定交換元的題的程式碼,同樣是貪心(時間複雜度未做優化):
//指定1為交換元
#include <cstdio>
const int MAXN = 100010;

int N, number[MAXN], sum = 0;

int find1Index() {
	for(int i=1; i<=N; i++) {
		if(number[i] == 1) return i;
	}
}

int findTheIndex(int x) {
	for(int i=1; i<=N; i++) {
		if(number[i] == x) return i;
	}
}

int findAIndex() {
	for(int i=1; i<=N; i++) {
		if(number[i] != i) return i;
	}
	return -1;
}

void print() {
	for(int i=1; i<=N; i++) {
		printf("%d ",number[i]);
	}
	printf("\n");
}

void swap(int &a, int &b) {  //////
	int temp = a;
	a = b;
	b = temp;
	sum++; 
	print();
}

int main() {
	scanf("%d",&N);
	for(int i=1; i<=N; i++) {
		scanf("%d",&number[i]);
	}
	while(1) {
		int index = find1Index();
		if(index != 1) {
			swap(number[index], number[findTheIndex(index)]);
		} else {
			int index2 = findAIndex();
			if(index2 != -1) {
				swap(number[index], number[index2]);
			} else {
				break;
			}
		}
	}
	printf("%d",sum);
	
	return 0;
}
10. 最大比例

相關推薦

16藍橋 c/c++ b 題解

1. 煤球數目  答案:171700#include <cstdio> int N = 100, sum1 = 0; int solve(int x) { int sum2 = 0; for(int i=1; i<=x; i++) sum2 +=

2016藍橋省賽A試題

2016年第七屆藍橋杯省賽(C/C++) A組試題及參考答案 第七屆藍橋杯省賽結束了,趁著還有點印象,趕緊把答案記一下。 歡迎加入à程式設計學習交流QQ群:23228338,一起交流藍橋杯答案及程式設計交流學習。群檔案有答案下載 1.父親和兒子(列舉) 父親的年齡兩個數字

2017藍橋”國賽BC/C++ 個人題解

前言:我參加了今年第八屆的藍橋杯國賽,只拿了個優秀獎,傷心。官方也沒有公佈試題和答案,在網上搜索了很久都沒有找到藍橋杯國賽的題目。突然有了一個不自量力的想法,趁還有一點記憶,把題目記錄下來,並且附上自己的做法。第一題:36進位制題意:用類似16進位制的表示辦法,A表示10,B

2016 藍橋 全國總決賽B題(完全平方數)

題目意思就是: 給你0,1,2,3,4,5,6,7,8,9十個數字,要你選出任意一個或幾個組合在一起成為完全平方數,每個數字都必須選且只能選一次,求可能的方案。 比如有其中幾種符合題意的情況: 0 16 25 73984 0 1 625 73984 0

藍橋:2017藍橋省賽B十題—PREV-40K倍區間

膜拜這位大佬 做法:首先統計字首和sum[i] 表示A1+A2+…+Ai.所以對於任意一段區間[l,r]的和就是sum[r]-sum[l-1].如果要保證這個區間和為K倍數就是:(sum[r]-sum[l-1])%k == 0.變形後就是:sum[r]%k==sum[l-1]%k,

藍橋Java語言B真題(省賽)

今天參加藍橋JAVA語言B組的競賽剛剛結束,把真題和大家分享一下。 1.煤球數目  (結果填空) 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100

2016藍橋C/C++程式設計本科B省賽 四平方和(程式設計大題)

2016年第七屆藍橋杯C/C++程式設計本科B組省賽題目彙總: 四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為

2016藍橋C/C++程式設計本科B省賽 生日蠟燭(結果填空)

2016年第七屆藍橋杯C/C++程式設計本科B組省賽題目彙總: 生日蠟燭 某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來,他一共吹熄了236根蠟燭

2016藍橋C/C++程式設計本科B省賽 剪郵票(結果填空)

2016年第七屆藍橋杯C/C++程式設計本科B組省賽題目彙總: 剪郵票 如【圖1.jpg】, 有12張連在一起的12生肖的郵票。 現在你要從中剪下5張來,要求必須是連著的。 (僅僅連線一個角不

2016藍橋試題(C/C++本科B

3.湊算式      B      DEF A + --- + ------- = 10      C      GHI       (如果顯示有問題,可以參見【圖1.jpg】)   這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。 比如: 6+8/3+952/

2016藍橋省賽(C/C++ A)

此處有目錄↑ 基本都是暴力搜尋解決,最後兩道演算法題不會 - - 1.父親和兒子 (列舉) 父親年齡是兩位數,且比兒子大27歲,問有多少種可能的情況?(父親30歲,兒子3歲也符合題意) 直接列舉父親年齡即可 答案是:7 #include <cstdio

2016藍橋C/C++程式設計本科B省賽 煤球數目(結果填空)

煤球數目有一堆煤球,堆成三角稜錐形。具體:第一層放1個,第二層3個(排列成三角形),第三層6個(排列成三角形),第四層10個(排列成三角形),....如果一共有100層,共有多少個煤球?請填表示煤球總數

2016藍橋省賽C /C++ A 1~8題題解

部分轉載自:http://blog.csdn.net/idealism_xxm/article/details/50937688還有:http://blog.csdn.net/summonlight/article/details/61427968題目連線:http://ww

2016藍橋C/C++程式設計本科B省賽 湊算式(結果填空) DFS

//A + B/C + DEF/GHI = 10 湊算式 標記一下1-9個數,再搜尋一下就好了#include <iostream> using namespace std; bool visited[10]; int ans[100]; int k = 0; i

煤球數目(2016藍橋c/c++省賽B(1題))

第一題 :煤球數目 題目敘述: 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), …. 如果

2016藍橋

交換瓶子有N個瓶子,編號 1 ~ N,放在架子上。比如有5個瓶子:2 1 3 5 4要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為:1 2 3 4 5對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式

藍橋Java C決賽試題

1.平方末尾能夠表示為某個整數的平方的數字稱為“平方數”比如,25,64雖然無法立即說出某個數是平方數,但經常可以斷定某個數不是平方數。因為平方數的末位只可能是:[0, 1, 4, 5, 6, 9] 這6個數字中的某個。所以,4325435332必然不是平方數。如果給你一個2

2016藍橋決賽心得

這次比賽,成績並不是太理想,雖然我是一個渣二本(河南農業大學,一聽,種地的還學程式設計???),卻金剛不可奪其志,毅然決然的報了A組C,學院不支援,最後倔著脾氣自費報名了。省賽順利通過,可是決賽只拿了一個國三。想想要總結一下這次的得失,可是感覺我應該從頭分析一下

2015藍橋決賽C語言A--穿越雷區(DFS)

X星的坦克戰車很奇怪,它必須交替地穿越正能量輻射區和負能量輻射區才能保持正常運轉,否則將報廢。 某坦克需要從A區到B區去(A,B區本身是安全區,沒有正能量或負能量特徵),怎樣走才能路徑最短? 已知的地

藍橋大學生Cjava決賽題目 密文搜尋

標題:密文搜尋福爾摩斯從X星收到一份資料,全部是小寫字母組成。他的助手提供了另一份資料:許多長度為8的密碼列表。福爾摩斯發現,這些密碼是被打亂後隱藏在先前那份資料中的。請你編寫一個程式,從第一份資料中搜