zoukankan      html  css  js  c++  java
  • 2016年蓝桥杯C/C++B组

    第一次參加蓝桥杯。也是有非常多感触的,时间全然不够写最后一题...

    最后一题没做...还有全排序非常重要...

    1、

    煤球数目

    有一堆煤球,堆成三角棱锥形。详细:
    第一层放1个,
    第二层3个(排列成三角形),
    第三层6个(排列成三角形),
    第四层10个(排列成三角形)。
    ….
    假设一共同拥有100层,共同拥有多少个煤球?

    请填表示煤球总数目的数字。
    注意:你提交的应该是一个整数,不要填写不论什么多余的内容或说明性文字。

    /*答案:171700*/ 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
    	int i,j;
    	int sum=0;
    	int num=1;
    	i=2;
    	for(j=1;j<=100;j++)
    	{
    		sum+=num;
    		num+=i;
    		i++;
    	}
    	cout<<sum<<endl;
    return 0;
     } 


    2、

    生日蜡烛

    某君从某年開始每年都举办一次生日party,而且每次都要吹熄与年龄同样根数的蜡烛。

    如今算起来。他一共吹熄了236根蜡烛。

    请问,他从多少岁開始过生日party的?

    请填写他開始过生日party的年龄数。
    注意:你提交的应该是一个整数,不要填写不论什么多余的内容或说明性文字。

    /*答案:26*/ 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
    	int i,j,sum,flag=0;
    	for(i=1;i<=100;i++)//一般仅仅能活到不超过100岁,不放心就多加一点儿 
    	{
    		sum=0;
    		for(j=i;j<=100;j++)
    		{
    			sum+=j;
    			if(sum==236)
    			{
    				flag=1;
    				break;
    			}
    			if(sum>236)break;
    		}
    		if(flag==1)
    		break;
    	}
    	cout<<i<<endl;
    return 0;
    }


    3、凑算式 B DEF A + — + ——- = 10 C GHI (假设显示有问题。能够參见【图1.jpg】) 这个算式中A~I代表1~9的数字。不同的字母代表不同的数字。

    比方: 6+8/3+952/714 就是一种解法。 5+3/1+972/486 是还有一种解法。 这个算式一共同拥有多少种解法? 注意:你提交应该是个整数。不要填写不论什么多余的内容或说明性文字。

    第七届蓝桥杯B组题目3

    /*答案:29*/ 
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    /*一种偷懒的办法,next_permutation这是一个求一个排序的下一个排列的函数,能够遍历全排列。但先要加
    #include <algorithm>头文件,当存在一个排列的下一个排列,则返回true,否则返回false,
    每运行一次。排列变为它的后继。与之全然相反的函数是prev_permutation*/ 
    int main()
    {
    	int a[11],sum=0,i;
    	for(i=0;i<=8;i++)
    	{
    		a[i]=i+1;
    	}
    	while(next_permutation(a,a+9))
    	{	
    		
    		if(fabs(a[0]+1.0*a[1]/a[2]+(1.0*100*a[3]+10*a[4]+a[5])/(100*a[6]+10*a[7]+a[8])-10)<1e-6)
    		{
    		sum++;
    		}
    	}
    	cout<<sum<<endl;
    return 0;
    }


    4、
    高速排序

    排序在各种场合常常被用到。
    高速排序是十分经常使用的高效率的算法。

    其思想是:先选一个“标尺”,
    用它把整个队列过一遍筛子,
    以保证:其左边的元素都不大于它,其右边的元素都不小于它。

    这样,排序问题就被切割为两个子区间。
    再分别对子区间排序就能够了。

    以下的代码是一种实现。请分析并填写划线部分缺少的代码。
    #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(“ ”);

    return 0;
    }
    注意:仅仅填写缺少的内容。不要书写不论什么题面已有代码或说明性文字。

     

    //答案:swap(a,p,j)
    #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);
        }
    	swap(a,p,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("
    ");
    	
    	return 0;
    }


    5、
    抽签

    X星球要派出一个5人组成的观察团前往W星。
    当中:
    A国最多能够派出4人。
    B国最多能够派出2人。


    C国最多能够派出2人。


    ….

    那么终于派往W星的观察团会有多少种国别的不同组合呢?

    以下的程序攻克了这个问题。
    数组a[] 中既是每一个国家能够派出的最多的名额。
    程序运行结果为:
    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 ”,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;
    }

    细致阅读代码,填写划线部分缺少的内容。

    注意:不要填写不论什么已有内容或说明性文字。

    //答案:f(a,k+1,m-i,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
    ",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);   //填空位置
    	}
    }
    int main()
    {	
    	int  a[N] = {4,2,2,1,1,3};
    	char b[BUF];
    	f(a,0,M,b);
    	return 0;
    }


    6、

    方格填数 例如以下的10个格子 +–+–+–+ | | | | +–+–+–+–+ | | | | | +–+–+–+–+ | | | | +–+–+–+ (假设显示有问题。也能够參看【图1.jpg】) 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共同拥有多少种可能的填数方案? 请填写表示方案数目的整数。

    注意:你提交的应该是一个整数,不要填写不论什么多余的内容或说明性文字。

    题目6

    /*答案:1580 直接搜索最后推断就能够。*/ 
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int a[11];
    int flag[10];
    int sum;
    int flag1;
    void DFS(int x)
    {
    	int i;
    	if(x==10)
    	{
    		flag1=1;
    		for(i=0;i<9;i++)
    		{
    		if(a[i]==0&&!(a[i+1]!=1&&a[i+1]!=3&&a[i+1]!=4&&a[i+1]!=5))
    		{
    			flag1=0;
    		}
    		if(a[i]==1&&!(a[i+1]!=0&&a[i+1]!=2&&a[i+1]!=4&&a[i+1]!=5&&a[i+1]!=6))
    		{
    			flag1=0;
    		}
    		if(a[i]==2&&!(a[i+1]!=1&&a[i+1]!=5&&a[i+1]!=6))
    		{
    			flag1=0;
    		}
    		if(a[i]==3&&!(a[i+1]!=4&&a[i+1]!=7&&a[i+1]!=8&&a[i+1]!=0))
    		{
    			flag1=0;
    		}
    		if(a[i]==4&&!(a[i+1]!=0&&a[i+1]!=1&&a[i+1]!=3&&a[i+1]!=5&&a[i+1]!=7&&a[i+1]!=8&&a[i+1]!=9))
    		{
    			flag1=0;
    		}
    		if(a[i]==5&&!(a[i+1]!=0&&a[i+1]!=1&&a[i+1]!=2&&a[i+1]!=4&&a[i+1]!=6&&a[i+1]!=8&&a[i+1]!=9))
    		{
    			flag1=0;
    		}
    		if(a[i]==6&&!(a[i+1]!=1&&a[i+1]!=2&&a[i+1]!=5&&a[i+1]!=9))
    		{
    			flag1=0;
    		}
    		if(a[i]==7&&!(a[i+1]!=3&&a[i+1]!=4&&a[i+1]!=8))
    		{
    			flag1=0;
    		}
    		if(a[i]==8&&!(a[i+1]!=3&&a[i+1]!=4&&a[i+1]!=5&&a[i+1]!=7&&a[i+1]!=9))
    		{
    			flag1=0;
    		}
    		if(a[i]==9&&!(a[i+1]!=6&&a[i+1]!=4&&a[i+1]!=5&&a[i+1]!=8))
    		{
    			flag1=0;
    		}
    		}
    		if(flag1)
    		{
    		sum++;
    		}
    		return ;
    	}
    	for(i=0;i<=9;i++)
    	{
    		if(flag[i]==0)
    		{
    			flag[i]=1;
    			a[x]=i;
    			DFS(x+1);
    			flag[i]=0;
    		}
    	}
    }
    int main()
    {
    	memset(flag,0,sizeof(flag));
    	sum=0;
    	DFS(0);
    	cout<<sum<<endl;
    return 0;
    }

    7、

    剪邮票

    如【图1.jpg】, 有12张连在一起的12生肖的邮票。
    如今你要从中剪下5张来,要求必须是连着的。
    (只连接一个角不算相连)
    比方。【图2.jpg】,【图3.jpg】中,粉红色所看到的部分就是合格的剪取。

    请你计算,一共同拥有多少种不同的剪取方法。

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数。不要填写不论什么多余的内容或说明性文字。

    第七届蓝桥杯B组题目7-1 第七届蓝桥杯B组题目7-3 第七届蓝桥杯B组题目7-2



    /*答案:116*/ 
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    int a[10];
    int flag[15];
    int flagtwo[15];
    int sum;
    void DFS(int x,int pos)
    {
    	int num;
    	int i,j;
    	if(x==6)
    	{
    		num=0;
    		memset(flagtwo,0,sizeof(flagtwo));
    		for(i=1;i<=5;i++)
    		{
    			for(j=1;j<=5;j++)
    			{
    				if(i!=j)
    				{
    					if(abs(a[i]-a[j])==4)num++;
    					else if((a[i]-1)/4==(a[j]-1)/4&&abs(a[i]-a[j])==1)num++;
    				}
    			}
    		}
    		if(num>=8)
    		{
    		for(i=1;i<=5;i++)
    		cout<<a[i]<<" ";
    		cout<<endl;
    		sum++;
    		}
    	}
    	for(i=pos;i<=12;i++)
    	{
    		if(flag[i]==0)
    		{
    			flag[i]=1;
    			a[x]=i;
    			DFS(x+1,i+1);
    			flag[i]=0;
    		}
    	}
    }
    int main()
    {
    	memset(flag,0,sizeof(flag));
    	sum=0;
    	DFS(1,1);
    	cout<<sum-20<<endl;	//	减20的目的是为了排除四个形成正方形的情况。这样的情况不成立,4*4+2+2。 
    return 0;
    }



    8、
    四平方和

    四平方和定理,又称为拉格朗日定理:
    每一个正整数都能够表示为至多4个正整数的平方和。
    假设把0包含进去,就正好能够表示为4个数的平方和。

    比方:
    5 = 0^2 + 0^2 + 1^2 + 2^2
    7 = 1^2 + 1^2 + 1^2 + 2^2
    (^符号表示乘方的意思)

    对于一个给定的正整数,可能存在多种平方和的表示法。


    要求你对4个数排序:
    0 <= a <= b <= c <= d
    并对全部的可能表示法按 a,b,c,d 为联合主键升序排列。最后输出第一个表示法
    程序输入为一个正整数N (N<5000000)
    要求输出4个非负整数,按从小到大排序,中间用空格分开

    比如,输入:
    5
    则程序应该输出:
    0 0 1 2

    再比如,输入:
    12
    则程序应该输出:
    0 2 2 2

    再比如,输入:
    773535
    则程序应该输出:
    1 1 267 838

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 3000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    全部代码放在同一个源文件里,调试通过后,拷贝提交该源代码。

    注意: main函数须要返回0
    注意: 仅仅使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 全部依赖的函数必须明白地在源文件里 #include <xxx>, 不能通过project设置而省略经常使用头文件。

    提交时,注意选择所期望的编译器类型。

    /*重点是四重循环绝对会超时,仅仅用三重循环做效率高多了。最后推断一下就能够了*/ 
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int main()
    {
    		int i,j,k,p,n;
    		scanf("%d",&n);
    		for(i=0;i<=(int)sqrt(n/4);i++)
    		{
    			for(j=i;j<=(int)sqrt(n/3);j++)
    			{
    				for(k=j;k<=(int)sqrt(n/2);k++)
    				{
    					p=n-i*i-j*j-k*k;
    					if(p<k*k)break;	//注意不能小于前面的数 ,仅仅能大于或者等于 
    					int a=(int)sqrt(p);
    					if(a*a==p)
    					{
    						cout<<i<<" "<<j<<" "<<k<<" "<<a<<endl;
    						goto Exit;
    					}
    				}
    			}
    		}
    		Exit:
    return 0;
    } 


    9、
    交换瓶子

    有N个瓶子,编号 1 ~ N,放在架子上。

    比方有5个瓶子:
    2 1 3 5 4

    要求每次拿起2个瓶子,交换它们的位置。


    经过若干次后,使得瓶子的序号为:
    1 2 3 4 5

    对于这么简单的情况,显然。至少须要交换2次就能够复位。

    假设瓶子很多其它呢?你能够通过编程来解决。

    输入格式为两行:
    第一行: 一个正整数N(N<10000), 表示瓶子的数目
    第二行:N个正整数,用空格分开,表示瓶子眼下的排列情况。

    输出数据为一行一个正整数,表示至少交换多少次。才干完毕排序。

    比如,输入:
    5
    3 1 2 5 4

    程序应该输出:
    3

    再比如,输入:
    5
    5 4 3 2 1

    程序应该输出:
    2

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 1000ms

    请严格按要求输出。不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    全部代码放在同一个源文件里,调试通过后,拷贝提交该源代码。

    注意: main函数须要返回0
    注意: 仅仅使用ANSI C/ANSI C++ 标准。不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 全部依赖的函数必须明白地在源文件里 #include <xxx>。 不能通过project设置而省略经常使用头文件。

    提交时,注意选择所期望的编译器类型。


    /*某位子不是该应有元素,则把它交换过来就可以,d数组是用来存元素i的当前位子d[i]*/ 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
    	int N,sum=0;
    	int d[10010];
    	int a[10010];
    	int i,j,temp;
    	scanf("%d",&N); 
    	for(i=1;i<=N;i++)
    	{
    		cin>>a[i];
    		d[a[i]]=i;
    	}
    	for(i=1;i<=N;i++)
    	{
    		if(d[i]!=i)
    		{
    			temp=a[i];
    			a[i]=a[d[i]];
    			a[d[i]]=temp;
    			d[temp]=d[i];
    			d[i]=i;
    			sum++;
    		}
    	}
    	cout<<sum<<endl;
    return 0;
    }


    10、

    最大比例

    X星球的某个大奖赛设了M级奖励。每一个级别的奖金是一个正整数。
    而且,相邻的两个级别间的比例是个固定值。
    也就是说:全部级别的奖金数构成了一个等比数列。比方:
    16,24,36,54
    其等比值为:3/2

    如今,我们随机调查了一些获奖者的奖金数。
    请你据此推算可能的最大的等比值。

    输入格式:
    第一行为数字N(N<100),表示接下的一行包括N个正整数
    第二行N个正整数Xi(Xi<1 000 000 000 000)。用空格分开。每一个整数表示调查到的某人的奖金数额

    要求输出:
    一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数

    測试数据保证了输入格式正确。而且最大比例是存在的。

    比如,输入:
    3
    1250 200 32

    程序应该输出:
    25/4

    再比如,输入:
    4
    3125 32 32 200

    程序应该输出:
    5/2

    再比如,输入:
    3
    549755813888 524288 2

    程序应该输出:
    4/1

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 3000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    全部代码放在同一个源文件里,调试通过后,拷贝提交该源代码。

    注意: main函数须要返回0
    注意: 仅仅使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 全部依赖的函数必须明白地在源文件里 #include <xxx>, 不能通过project设置而省略经常使用头文件。

    提交时,注意选择所期望的编译器类型。


    第10题没有做。

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7243479.html
Copyright © 2011-2022 走看看