2016蓝桥杯省赛B组
2016蓝桥杯省赛B组
1.煤球数目

#include<bits/stdc++.h>
using namespace std;
int dp[200];
int main(){
int sum=0;
for(int i=1;i<=100;i++){
dp[i]=dp[i-1]+i;
sum+=dp[i];
}
cout<<sum;
return 0;
}
另一种写法
#include <iostream>
using namespace std;
typedef long long int ll;
ll ans;
ll a;
int main()
{
for(int i=1;i<=100;i++){
a=a+i;
ans+=a;
}
cout<<ans;
return 0;
}
思路:
每一层煤球个数
0+1->1+2->3+3->6+4
答案:171700
2.生日蜡烛
using namespace std;
int age;
int main(){
for(age=0;age<=236;age++){
int sum=0;
for(int i=age;sum<236;i++){
sum+=i;
}
if(sum==236){
cout<<age;
return 0;
}
}
return 0;
}
3.凑算式

#include<bits/stdc++.h>
using namespace std;
int main(){
long long int ans=0;
for(double a=1;a<10;a++){
for(double b=1;b<10;b++){
if(b==a)continue;
for(double c=1;c<10;c++){
if(c==a||c==b)continue;
for(double d=1;d<10;d++){
if(d==a||d==b||d==c)continue;
for(double e=1;e<10;e++){
if(e==a||e==b||e==c||e==d)continue;
for(double f=1;f<10;f++){
if(f==a||f==b||f==c||f==d||f==e)continue;
for(double g=1;g<10;g++){
if(g==a||g==b||g==c||g==d||g==e||g==f)continue;
for(double h=1;h<10;h++){
if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
for(double i=1;i<10;i++){
if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;
double p=d*100+e*10+f;
double q=g*100+h*10+i;
if(a+b/c+p/q==10){
ans++;
}
}
}
}
}
}
}
}
}
}
cout<<ans;
}
标准答案:用dfs枚举每一位,因为要求每一位的值所以用搜索dfs。全排列
#include<bits/stdc++.h>
using namespace std;
double a[10];
int ans;
bool visit[10];
void dfs(int index){
if(index==9){//9位填满
if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8])==10){//对应A~I每一位
ans++;
return ;
}
}
//dfs
for(int i=1;i<10;i++){//为当前位赋值有1~9这几种可能值
if(!visit[i]){//如果这个值没有访问过就赋给当前位
visit[i]=true;//这个值被访问
a[index]=i;
dfs(index+1);//跳去下一层
visit[i]=false;//恢复现场
}
}
}
int main(){
dfs(0);
cout<<ans;
}
4.交换瓶子

#include <iostream>
using namespace std;
const int N=1e4+6;
int a[N];
int n;
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(a[i]!=i){
int z=a[i];
int temp=a[i];
a[i]=a[z];
a[z]=temp;
ans++;
i--;//注意一定要保证当前位置直到换到对才停
}
}
cout<<ans;
// 请在此输入您的代码
return 0;
}
贪心:
从左往右遍历所有瓶子,只要位置不对,就交换他和他应该在的位置上的瓶子,让这个瓶子归位。
5.四平方和
6.快速排序(填空题)

第七题:抽签(填空题)

#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);//答案,k+1表示换下一个国家,m-i表示上一次结束还需要分m人但是这次分了i人所以还要分m-i人,注意M,因为每次结束还需要分的人数不同不能用M。
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};//存放每个国家人数
char b[BUF];//存放当前方案
f(a,0,M,b);
return 0;
}
第八题:方格填数
注意:是这10个格子填的数不能一样,而且填的范围0~9

#include<bits/stdc++.h> using namespace std; int a[10]; int res; bool st[10]; bool check(){ if(abs(a[0]-a[1])==1||abs(a[0]-a[5])==1||abs(a[0]-a[4])==1||abs(a[0]-a[3])==1|| abs(a[1]-a[2])==1||abs(a[1]-a[6])==1||abs(a[1]-a[5])==1||abs(a[1]-a[4])==1|| abs(a[2]-a[5])==1||abs(a[2]-a[6])==1||abs(a[3]-a[4])==1||abs(a[3]-a[8])==1|| abs(a[3]-a[7])==1||abs(a[4]-a[5])==1||abs(a[4]-a[8])==1||abs(a[4]-a[7])==1|| abs(a[4]-a[9])==1||abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1|| abs(a[7]-a[8])==1||abs(a[8]-a[9])==1||abs(a[6]-a[9])==1)return false; return true; } void dfs(int m){ if(m==10){ if(check()){ res++; } } for(int i=0;i<10;i++){ if(!st[i]){ st[i]=true; a[m]=i; dfs(m+1); st[i]=false; } } } int main(){ dfs(0);//从第0个位置开始搜 cout<<res; }

第9题:最大比例
10的9次方要开long longm


#include<bits/stdc++.h>
using namespace std;typedef long long int ll;
const int N=106;
ll x[N];//存放输入数
ll a[N];//存放分子
ll b[N];//存放分母
ll gcd(ll m,ll n){//这个更万能,用于求两个数的最大公因数
if(n==0)return m;
return gcd(n,m%n);
}
ll sub_gcd(ll m,ll n){//仅适用等比,这个时候才可以除求最大公因数,而且效率更高
if(m<n) swap(m,n);//重要
if(n==1)return m;
return sub_gcd(n,m/n);
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>x[i];
}
sort(x,x+n);//排序
int cnt=0;
//除以第0项
for(int i=1;i<n;i++){
if(x[i]!=x[i-1]){//去重
ll d=gcd(x[i],x[0]);
a[cnt]=x[i]/d;
b[cnt]=x[0]/d;
cnt++;
}
}
ll up=a[0];//结果分子
ll down =b[0];//结果分母
for(int i=1;i<cnt;i++){
up=sub_gcd(up,a[i]);
down=sub_gcd(down,b[i]);
}
cout<<up<<"/"<<down;
return 0;
}
暴力无脑87.5分代码
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=110;
ll a[N];
ll gcd(ll x,ll y){
if(y){
return gcd(y,x%y);
}
else{
return x;
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
ll g=gcd(a[0],a[1]);
ll A=a[1]/g;
ll B=a[0]/g;
double d=(1.0*a[1])/a[0];
for(int i=2;i<n;i++){
if((1.0*a[i])/a[i-1]<d){
d=(1.0*a[i])/a[i-1];
g=gcd(a[i],a[i-1]);
A=a[i]/g;
B=a[i-1]/g;
}
}
cout<<A<<"/"<<B;
return 0;
}
/*
代码错误的原因把相邻数壁纸最小的当做公比
其实可能这两个数之间还有别的等级他们两个并不是相邻等级
*/
补充:更相减损法
def gcd_by_subtraction(a, b):
while a != b:
if a > b:
a = a - b
else:
b = b - a
return a
num1 = 24
num2 = 36
result = gcd_by_subtraction(num1, num2)
print(f"{num1} 和 {num2} 的最大公因数是: {result}")
第十题:剪邮票


浙公网安备 33010602011771号