蓝桥杯2017年省赛题解代码

1、购物单

#include<iostream>
using namespace std;
int main(){
	double a,b;
	double sum=0;
	while(cin>>a>>b){
		sum+=a*b;
		cout<<"sum="<<sum<<endl;
	} 
	return 0;
}
//结果5200 

2、等差素数列

#include<iostream>
using namespace std; 
int prime[100050];
int num=0;
bool f[400050]={false};
void Findprime(){
	for(int i=2;i<400000;i++){
		if(!f[i]){
			prime[num++]=i;
			for(int j=2*i;j<400000;j+=i){
				f[j]=true;
			}
		}
	}
}
int main(){
	Findprime();//f中 false为素数,true为非素数 
	for(int i=2;i<10000;i++){//枚举公差 
		for(int j=2;j<num;j++){//枚举起始点
			for(int k=j;k<j+10*i&&k<4000000;k+=i){
				if(f[k]) break;
				if(k==j+9*i) cout<<i<<" "<<j<<" "<<k<<" "<<f[k]<<endl;
			}
		}
	}
	cin>>num;
	return 0;
}

3、承压计算

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std; 
double a[35][35]={0},b[35][35]={0};
int main(){
	for(int i=1;i<30;i++){
		for(int j=1;j<=i;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=30;i++){
		for(int j=1;j<=i;j++){
			if(j==1) b[i][1]+=b[i-1][1]/2+a[i-1][1]/2;
			else if(j==i) b[i][j]+=b[i-1][j-1]/2+a[i-1][j-1]/2;
			else b[i][j]+=(b[i-1][j-1]+b[i-1][j])/2+(a[i-1][j-1]+a[i-1][j])/2;
		}
	}
	double m1=10000,m2=0;
	for(int i=1;i<=30;i++){
		m1=min(m1,b[30][i]);
		m2=max(m2,b[30][i]);
	}
	cout<<m1<<" "<<m2<<endl;
	printf("%lf\n",2086458231/m1*m2);
	while(1);
	return 0;
}

4、方格分割

#include<iostream>
using namespace std;
bool vis[7][7]={false};
int num=0,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void DFS(int x,int y){
	if(x==0||x==6||y==0||y==6){
		num++;
		return;
	}
	for(int i=0;i<4;i++){
		if(!vis[x+dx[i]][y+dy[i]]) {
			vis[x][y]=vis[6-x][6-y]=true;
			DFS(x+dx[i],y+dy[i]);
			vis[x][y]=vis[6-x][6-y]=false;
		}
	}
}
int main(){
	DFS(3,3);
	cout<<num/4<<endl;
}

5、取数位

#include<cstdio>// 求x用10进制表示时的数位长度 
int len(int x){
    if(x<10) return 1;
    return len(x/10)+1;
}

// 取x的第k位数字
int f(int x, int k){
    if(len(x)-k==0) return x%10;
    return f(x/10,k);  //填空
}

int main()
{
    int x = 23574;
    printf("%d\n", f(x,3));
    return 0;
}

6、最大公共子串

#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2){
    int a[N][N];
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i,j;
    memset(a,0,sizeof(int)*N*N);
    int max = 0;
    for(i=1; i<=len1; i++){
        for(j=1; j<=len2; j++){
            if(s1[i-1]==s2[j-1]) {
                a[i][j] = a[i-1][j-1]+1;  //填空
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }
    return max;
}
int main(){
    printf("%d\n", f("abcdkkk", "baabcdadabc"));
    return 0;
}

7、日期问题

#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int seek(int x,int y,int z){
	if(x>=60) x+=1900;
	else x+=2000;
	if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
		month[2] = 29;
	}
	if(y>12||month[y]<z) return -1;
	return x*10000+y*100+z;
}
int main() {
	int a,b,c;
	set<int> s;
	scanf("%d/%d/%d",&a,&b,&c);
	s.insert(seek(a,b,c));
	s.insert(seek(c,a,b));
	s.insert(seek(c,b,a));
	for(set<int>::iterator it=s.begin();it!=s.end();it++){
		if(*it!=-1)	printf("%d-%02d-%02d\n",*it/10000,*it/100%100,*it%100);
	}
	return 0;
}

8、包子凑数

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[110],n;
bool dp[10010];
int gcd(int a,int b){
    if(b == 0) return a;
    return gcd(b,a%b);
}
int main(){
	cin>>n;
    for(int i = 0 ; i < n ; i ++){
    	cin>>a[i];
    }
    int t = a[0];
    for(int i = 1 ; i < n ; i ++)
        t = gcd(t,a[i]);
    if(t != 1)
    	cout<<"INF"<<endl;
    else{
        dp[0] = true;
        for(int i = 0 ; i < n ; i ++){
            for(int j = 0 ; j + a[i] <10000; j++){
                if(dp[j]) dp[j+a[i]]=true;
            }
        }
        int count = 0;
        for(int i=1;i<10000;i++){
            if(!dp[i]) count++;
        }
        cout<<count<<endl;
    }
    return 0;
}

9、分巧克力

#include<iostream>
#include<algorithm>
using namespace std;
struct qkl{
	int h,w;
}s[100050];
int n,k;

bool ok(int x){//验证x作边长是否满足 
	int t=0;
	for(int i=0;i<n;i++){
		t+=(s[i].h/x)*(s[i].w/x);
		if(t>=k) return true;
	}
	return false;
}

int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>s[i].h>>s[i].w;
	}
	int l=1,r=100000;
	while(l<=r){
		int x=(l+r)/2;
		if(ok(x)) l=x+1;
		else r=x-1;
	}
	l++;
	while(l--){
		if(ok(l)) break;
	}
	cout<<l;
	return 0;
}

10、K倍区间

#include<iostream>
#include<map>
using namespace std;//(sum[r]-sum[l-1])%k == 0转化为sum[r]%k==sum[l-1]%k,
int main(){
	long long n,k,t,sum[100050]={0},num=0;
	map<int,int> mp;
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>t;
		sum[i+1]=(sum[i]+t)%k;
	}
	for(int i=1;i<=n;i++){//复杂度O(n) 
		num+=(mp[sum[i]]++);//当sum[l]%k==sum[r]%k 且l!=r的数据 
	}
	num+=mp[0];//l等于r时,即前l==r项和等于k整数倍的数据个数  
	cout<<num;
	return 0;
} 
/*复杂度O(n方) 
for(int l=1;l<=n;l++){
	for(int r=l;r<=n;r++){
		if((sum[r]-sum[l-1])%k==0) num++;
	}
}*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值