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;
}
思路:
每一层煤球个数
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 ;}}//dfsfor(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.四平方和
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int a=0;a<=sqrt(n);a++){
for(int b=0;b<=sqrt(n);b++){
for(int c=0;c<=sqrt(n);c++){
考点:不要再来一层循环,防超时,当总和确定可以用总和减,然后开方得到d在平方回去验证(因为开放可能是四舍五入不一定刚好是)
int d=sqrt(n-a*a-b*b-c*c);
if(a*a+b*b+c*c+d*d==n){
cout<<a<<" "<<b<<" "<<c<<" "<<d;
return 0;
}
}
}
}
// 请在此输入您的代码
return 0;
}
6.快速排序(填空题)
第七题:抽签(填空题)
#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024void 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;
}
第八题:方格填数
#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