# 2016年第七届蓝桥杯C/C++B组省赛题目及答案1

## 01. 煤球数目

#include <iostream>
using namespace std;

int main()
{
int pre = 1;
int plus = 2;
long sum = 1;
//以上定义好第一层
for (int k = 2; k <= 100; k++)
{
pre = pre + plus; //上一层+增量 = 当前层
sum += pre;
plus++;
}
cout << sum << endl;
return 0;
}


## 02. 生日蜡烛

#include <iostream>
using namespace std;

int main()
{
int i = 1; //i表示岁数
int ans = 0;
while (true)
{
int j = i; //j表示从第j岁开始吹蜡烛
int sum = 0;
while (sum <= 236)
{
sum += j;
j++;
if (sum == 236)
ans = i;
}
i++;
if (ans != 0)
break;
}
cout << ans << endl;
return 0;
}


#include <iostream>
using namespace std;

int main()
{
//方法一：枚举两个年龄
for (int i = 1; i <100; i++)
{
for(int j = i; j < 100; j++)
{
if ((i+j)*(j-i+1)/2 == 236)
{
cout << i << " " << j << endl;
}
}
}

//方法二：枚举生日举办次数
for (int n = 1; n < 100; n++)
{
int t = n*(n-1)/2;
if ((236-t)%n == 0)
{
//输出首项
cout <<  (236-t)/n << " " << n << endl;
}
}
return 0;
}


## 03. 凑算式

#include <iostream>
using namespace std;

int main()
{
int ans = 0;
for (int A = 1; A <=9; A++)
{
for (int B = 1; B <= 9; B++)
{
if (B != A)
{
for (int C = 1; C <= 9; C++)
{
if (C != A && C != B)
{
for (int D = 1; D <= 9; D++)
{
if (D != A && D != B && D != C)
{
for (int E = 1; E <= 9; E++)
{
if (E != A && E != B && E != C && E != D)
{
for (int F = 1; F <= 9; F++)
{
if (F != A && F != B && F != C && F != D && F != E)
{
for (int G = 1; G <= 9; G++)
{
if (G != A && G != B && G != C && G != D && G != E && G!= F)
{
for (int H = 1; H <= 9; H++)
{
if (H != A && H != B && H != C && H != D && H != E && H!= F && H != G)
{
for (int I = 1; I <= 9; I++)
{
if (I != A && I != B && I != C && I != D && I != E && I!= F && I != G && I != H)
{
double a = D*100+E*10+F;
double b = G*100+H*10+I;
double t = (double)B / (double)C;
if ((A+t+a/b) == 10)
{
ans++;
cout << A << " " << B << " " << C << " " << D << " " << E << " " << F << " " << G << " " << H << " " << I << endl;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout << ans << endl;
return 0;
}


#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int a[] = {1,2,3,4,5,6,7,8,9};

int ans;

bool check()
{
int x = a[3] * 100 + a[4] * 10 + a[5];  //DEF
int y = a[6] * 100 + a[7] * 10 + a[8];  //GHI
if ((a[1] * y + a[2] * x) % (y * a[2]) == 0 && a[0] + (a[1] * y + a[2] * x) / (y * a[2]) == 10)
return true;  // B/C+DEF/GHI 这个式子通分后要能整除，且整个式子的计算结果=10
return false;
}

/*递归回溯生成全排列，适用于无重复元素的情况，这个可以当做套路记住！！！
*考虑第k位，k前面已经排定*/
void f(int k)
{
if (k == 9)
{  //一种排列已经生成
if (check())
ans++;
}  //出口

//从k往后的每个数字都可以放在k位
for (int i = k; i < 9; i++)
{
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}

f(k+1);  //递归

{
int t = a[i];
a[i] = a[k];
a[k] = t;
} //回溯
}
}

int main()
{
f(0);  //方法一：手动全排列

/*
//方法二：自动全排列
do
{
if (check())
ans++;
} while(next_permutation(a,a+9));  //要加头文件#include <algorithm>
//使用next_permutation的要求：a必须是有序的
*/

cout << ans << endl;
return 0;
}


## 04. 快速排序

#include <stdio.h>
void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
while(1){
while(i<r && a[++i]<x);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
______________________;

return j;
}

void quicksort(int a[], int p, int r)  //快排
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}

int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;

quicksort(a, 0, N-1);

for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");

return 0;
}


## 05. 抽签

X星球要派出一个5人组成的观察团前往W星。

A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。

DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF

(以下省略，总共101行)

#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';
______________________;  //填空位置
}
}
int main()
{
int  a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}


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

int ans; //验证答案总数对不对
void f(int a[], int k, int m, char b[])
{ //a是国家可以派出的人数，k是a数组的下标，m代表人数，初始为5，b是缓冲字符串
int i,j;
if(k==N){
b[M] = 0;  //字符串结尾的标志
if(m==0)
{
printf("%s\n",b);
ans++;
}

return;
}

for(i=0; i<=a[k]; i++){ //第k个国家从  0~最多派出人数  逐一尝试，每次循环派出i人
for(j=0; j<i; j++)
b[M-m+j] = k+'A';  //填充buf,有i人就填i歌国家符号（k+'A'，就是把数组下标转成字符，下标0+'A'得A，下标1+'A'得B……）
//______________________;  //填空位置
//观察可得，k，m，b[]在其他地方都没有变化，那么只能在这一行，一行要使3歌参数变化，就递归
f(a,k+1,m-i,b);  //第k个国家考虑完了就考虑下一个，即k+1；m是可派出的总人数，这一轮派了i个，那么后面的只能派出m-i个
}
}
int main()
{
int  a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
printf("ans = %d\n",ans);
return 0;
}

• 点赞 1
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏 2
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

等等waiting_

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
03-21 3175

03-23 829
07-23 57
03-21 1万+
03-21 6833
04-11 1728