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年第八屆“藍橋杯”國賽B組C/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區本身是安全區,沒有正能量或負能量特徵),怎樣走才能路徑最短? 已知的地
第七屆藍橋杯大學生C組java決賽題目 密文搜尋
標題:密文搜尋福爾摩斯從X星收到一份資料,全部是小寫字母組成。他的助手提供了另一份資料:許多長度為8的密碼列表。福爾摩斯發現,這些密碼是被打亂後隱藏在先前那份資料中的。請你編寫一個程式,從第一份資料中搜