zoukankan      html  css  js  c++  java
  • 蓝桥杯历年穷举题

    蓝桥杯历年穷举题

    2013年第一题高斯日记

    大数学家高斯有个好习惯:无论如何都要记日记。
    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
    后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
    高斯出生于:1777年4月30日。
    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
    高斯获得博士学位的那天日记上标着:8113
    请你算出高斯获得博士学位的年月日。
    提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

    #include<stdio.h>
    int isleap(int year)//判断是否为闰年
    {
    	if(year%4==0&&year%100!=0||year%400==0)
    	return 1;
    	else
    	return 0;
    }
    int main()
    {
    	int day; 
    	int month[2][12]={
    	31,28,31,30,31,30,31,31,30,31,30,31,
    	31,29,31,30,31,30,31,31,30,31,30,31,
    	};//二维数组存放闰年和非闰年的时候
    	int n=8113,year=1777,monthnum=4,daynum=30;
    	for(;year<=2020;year++)
    	{
    		if(isleap(year))
    		n-=366;
    		else
    		n-=365;
    		if(n<0)
    		{
    			if(isleap(year))
    			n+=366;
    			else
    			n+=365;	
    			break;
    		}
    	}
    	for(day=1;day<n;day++)
    	{
    		if(daynum<month[isleap(year)][monthnum-1])
    		daynum++;
    		else {
    		daynum=1;
    		monthnum++;
    		}
    	}
    	printf("%d-%d-%d",year,monthnum,daynum);
    	
    	return 0;
    }
    

    2013年第二题马虎的算式

    小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
    有一次,老师出的题目是:36 x 495 = ?
    他却给抄成了:396 x 45 = ?
    但结果却很戏剧性,他的答案竟然是对的!!
    假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
    能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
    请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
    满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
    因为 36 * 495 = 396 * 45 = 17820
    类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

    # include <stdio.h>
    int main()
    {
    	int a,b,c,d,e,num=0;
    	for(a=1;a<10;a++)
    	{
    		for(b=1;b<10;b++)
    		{
    			if(a==b)
    			continue;
    			for(c=1;c<10;c++)
    			{
    				if(c==b||c==a)
    				continue;
    				for(d=1;d<10;d++)
    				{
    					if(d==a||d==b||d==c)
    					continue;
    					for(e=1;e<10;e++)
    					{
    						if(e==a||e==b||e==c||e==d)
    						continue;
    						if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
    						num++;
    					}
    				}
    
    			}
    		}
    	}
    	printf("%d
    ", num);
    }
    

    2013年第三题第39级台阶

    小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

    站在台阶前,他突然又想着一个问题:
    如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
    请你利用计算机的优势,帮助小明寻找答案。

    # include <stdio.h>
    int dp[50][2];
    int main()
    {
    	int i; 
        dp[0][0]=1;//在第0级台阶 走了偶数步 
        dp[0][1]=0;//在第0级台阶 走了奇数步 
        dp[1][0]=0;//在第1级台阶 走了偶数步 
        dp[1][1]=1;//在第1级台阶 走了奇数步 
        for(i=2;i<=39;i++){
            dp[i][0]=dp[i-2][1]+dp[i-1][1];
            dp[i][1]=dp[i-2][0]+dp[i-1][0];
        }
        printf("%d",dp[39][0]);
        return 0;
    }
    

    2014年第一题啤酒和饮料

    啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。

    我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

    注意:答案是一个整数。请通过浏览器提交答案。

    不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。

    #include <stdio.h>
    int main()
    {
    	int i,j;
    	for(i=1;i<=82.3/1.9;i++)
    	{
    		for(j=1;j<i;j++)
    		{
    			if(fabs(82.3*1.0-i*1.9-j*2.3)<=0.00001)
    				printf("%d
    ",j);
    		}
    	}
    	
    	return 0;
    }
    

    2014年第二题切面条

    一根高筋拉面,中间切一刀,可以得到2根面条。

    如果先对折1次,中间切一刀,可以得到3根面条。

    如果连续对折2次,中间切一刀,可以得到5根面条。

    那么,连续对折10次,中间切一刀,会得到多少面条呢?

    答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	int a[12],i;
    	a[1]=2;
    	for(i=2;i<=11;i++)
    	a[i]=a[i-1]+pow(2,i-2);	
    	printf("%d
    ",a[11]);
    	return 0;
    }
    

    2014年第三题李白打狗

    话说大诗人李白,一生好饮。幸好他从不开车。

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

    注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

    #include <stdio.h>
    int main()
    {
    	int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,r,sum,w,t,z=0,v,s[15];//定义路上的15次遇到店和花
    	for(a=1;a<=2;a++)
    	for(b=1;b<=2;b++)
    	for(c=1;c<=2;c++)
    	for(d=1;d<=2;d++)
    	for(e=1;e<=2;e++)
    	for(f=1;f<=2;f++)
    	for(g=1;g<=2;g++)               //每次都有两种可能性共有十五次,2代表遇到店,1代表遇到花
    	for(h=1;h<=2;h++)
    	for(i=1;i<=2;i++)
    	for(j=1;j<=2;j++)
    	for(k=1;k<=2;k++)
    	for(l=1;l<=2;l++)
    	for(m=1;m<=2;m++)
    	for(n=1;n<=2;n++)
    	{
    	s[0]=a;
    	s[1]=b;
    	s[2]=c;
    	s[3]=d;
    	s[4]=e;
    	s[5]=f;
    	s[6]=g;
    	s[7]=h;
    	s[8]=i;                //将每一种可能性都先放在s[]里
    	s[9]=j;
    	s[10]=k;
    	s[11]=l;
    	s[12]=m;
    	s[13]=n;
    	s[14]=1;  
     
    	sum=0; //每次循环初始化
    	for(v=0;v<15;v++)
    	sum=sum+s[v]; //求和
    
    	if(sum==20)//筛选出遇到5次店面和10次花,恒等于20
    	{
    	r=2;//每次循环酒壶里的酒初始化
    	for(w=0;w<15;w++)
    	{
    		t=s[w];
    		if(t==2)
    		r=2*r;        //利用循环判断,如果s[]为2,则表示遇到店,否则,则是为1,遇到花;遇到店加倍,遇到花喝一斗
    		else
    		r--;
    	}
    
    	if(r==0)//如果酒壶里的酒一滴不剩,则把这种情况输出
    	{
    	z++;
    	for(t=0;t<15;t++)
    	printf("%d  ",s[t]);
    	printf("
    ");
    	}
    	}
    	}
    	printf("
    z=%d
    ",z);//最后输出总的种数
    }
    

    2014年第六题奇怪的分式

    上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

    1/4 乘以 8/5

    小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

    老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

    对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

    请写出所有不同算式的个数(包括题中举例的)。

    显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

    但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

    注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

    //a,b,c,d代表原式中的各个字母
    #include <stdio.h>
    int sum=0;
    int main(){
    	int a,b,c,d;
        for(a=1;a<=9;a++){
            for(b=1;b<=9;b++){
                for(c=1;c<=9;c++){
                    for(d=1;d<=9;d++){
                        if(a!=b && c!=d &&(a*c*(b*10+d))==(b*d*(a*10+c))){
                            sum++;
                        }
                    }
                }
            }
        }
        printf("%d",sum);
        return 0;
    }
    

    2015年第一题奖券数目

    奖券数目

    有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
    虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

    请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

    #include <stdio.h>
    int main()
    {	
    	int  i,j,k,l,m,c=0;
    	for(i=1;i<=9;i++)
    		for(j=0;j<=9;j++)
    			for(k=0;k<=9;k++)
    				for(l=0;l<=9;l++)
    					for(m=0;m<=9;m++)
    						if(i!=4 && j!=4 && k!=4 && l!=4 && m!=4)
    							c++;
    	printf("%d",c);
    	return 0;
    }
    

    2015年第二题星际炸弹

    星系炸弹

    在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
    每个炸弹都可以设定多少天之后爆炸。
    比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
    有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

    请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
    请严格按照格式书写。不能出现其它文字或符号。

    #include <stdio.h>
    int main()
    {	
    	int  day[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
    	int y=2014,m=11,d=9,i,r=0;
    	for(i=0;i<1000;i++)
    	{
    		d++;
    		if((y%4==0 && y%100!=0) || y%400==0)
    			r=1;
    else
    r=0;
    		if(d>day[r][m-1])
    		{
    			
    			d=d-day[r][m-1];
    			m++;
    		}
    		if(m>12)
    		{
    			y++;
    			m-=12;
    		}
    	}
    	printf("%d-%02d-%02d",y,m,d);
    	return 0;
    }
    

    2015年第三题三羊生瑞气

    三羊献瑞

    观察下面的加法算式:

    祥 瑞 生 辉

    +三 羊 献 瑞


    三 羊 生 瑞 气

    (如果有对齐问题,可以参看【图1.jpg】)

    其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

    请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

    #include <stdio.h>
    int main()
    {	
    	int a,b,c,d,e,f,g,h;
    	for(a=1;a<=9;a++)
    		for(b=0;b<=9;b++)
    		
    			if(a!=b)
    				for(c=0;c<=9;c++)			
    					if(a!=c && b!=c ) 
    						for(d=0;d<=9;d++)				
    							if(a!=d && b!=d && c!=d)
    								for(e=1;e<=9;e++)					
    									if(a!=e && b!=e && c!=e && d!=e)
    										for(f=0;f<=9;f++)						
    											if(a!=f && b!=f && c!=f && d!=f && e!=f)
    												for(g=0;g<=9;g++)							
    													if(a!=g && b!=g && c!=g && d!=g && e!=g && f!=g )
    														for(h=0;h<=9;h++)
    															if(a!=h && b!=h && c!=h && d!=h && e!=h && f!=h && g!=h && a*1000+b*100+c*10+d+e*1000+f*100+g*10+b==e*10000+f*1000+c*100+b*10+h)
    																printf("%d%d%d%d
    ",e,f,g,b);
    								
    									
    					
    							
    	
    	return 0;
    }
    

    2015年第六题加法变乘法

    加法变乘法

    我们都知道:1+2+3+ ... + 49 = 1225
    现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

    比如:
    1+2+3+...+1011+12+...+2728+29+...+49 = 2015
    就是符合要求的答案。

    请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

    注意:需要你提交的是一个整数,不要填写任何多余的内容。

    #include <stdio.h>
    	
    int main()
    {
    	int i,j;
    	for(i=1;i<=48;i++)
    		for(j=1;j<=48;j++)
    		{
    			if(i*(i+1)+j*(j+1)==2015-1225+2*i+1+2*j+1 && i+2<j && i!=10)
    				printf("%d",i);
    		}
    	return 0;
    }
    

    2015年第七题牌型总数

    牌型种数

    小明被劫持到X赌城,被迫与其他3人玩牌。
    一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
    这时,小明脑子里突然冒出一个问题:
    如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

    请填写该整数,不要填写任何多余的内容或说明文字。

    #include <stdio.h>
    	
    int main()
    {
    	int sum=0;
    	int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
    	for( a0=0;a0<=4;a0++)
    		for( a1=0;a1<=4;a1++)
    			for( a2=0;a2<=4;a2++)
    				for( a3=0;a3<=4;a3++)
    					for( a4=0;a4<=4;a4++)
    						for( a5=0;a5<=4;a5++)
    							for( a6=0;a6<=4;a6++)
    								for( a7=0;a7<=4;a7++)
    									for( a8=0;a8<=4;a8++)
    										for( a9=0;a9<=4;a9++)
    											for( a10=0;a10<=4;a10++)
    												for( a11=0;a11<=4;a11++)
    													for( a12=0;a12<=4;a12++)
    														if(a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12==13)
    															sum++;
    	printf("%d",sum);
    	return 0;
    }
    
    

    2016年第一题煤球数目

    有一堆煤球,堆成三角棱锥形。具体:
    第一层放1个,
    第二层3个(排列成三角形),
    第三层6个(排列成三角形),
    第四层10个(排列成三角形),
    ....
    如果一共有100层,共有多少个煤球?

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

    #include<stdio.h>
    int main()
    {
    	int a[101] ={0},i,j;
    	for(i = 1 ; i < 101 ; i ++)
    		a[i] = a[i-1] + i;
    	int ans = 0;
    	for(j = 1 ; j < 101 ; j ++)
    		ans += a[j];
    	printf("%d
    ",ans);
    	return 0;
    }
    

    2016年第二题生日蜡烛

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

    现在算起来,他一共吹熄了236根蜡烛。

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

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

    #include<stdio.h>
    int main()
    {
    	int start,end,i;
    	for(start = 1 ; start < 236 ; start ++)
    	{
    		for( end = start ; end < 236 ; end ++ )
    		{
    			int sum = 0;
    			for(i = start; i <= end; i ++)
    				sum += i;
    			if( sum == 236)
    			{
    				printf("start : %d end : %d
    ",start,end);
    			}
    		}
    	}
    	return 0;
    }
    

    2016年第三题凑算式

    凑算式

    ​ B DEF

    A + --- + ------- = 10
    C GHI

    (如果显示有问题,可以参见【图1.jpg】)

    这个算式中AI代表19的数字,不同的字母代表不同的数字。

    比如:
    6+8/3+952/714 就是一种解法,
    5+3/1+972/486 是另一种解法。

    这个算式一共有多少种解法?

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

    #include<stdio.h>
    
    int main(){
    	int num=0,a,b,c,d,e,f,g,h,i;
    	for(a=1;a<=9;a++){
    		for(b=1;b<=9;b++){
    			if(b==a)
    			    continue;
    			for(c=1;c<=9;c++){
    				if(c==a||c==b)
    				    continue;
    				for(d=1;d<=9;d++){
    					if(d==a||d==b||d==c)
    					    continue;
    					for(e=1;e<=9;e++){
    						if(e==d||e==c||e==b||e==a)
    						    continue;
    						for(f=1;f<=9;f++){
    							if(f==e||f==d||f==c||f==b||f==a)
    							    continue;
    							for(g=1;g<=9;g++){
    								if(g==f||g==e||g==d||g==c||g==b||g==a)
    								    continue;
    								for(h=1;h<=9;h++){
    									if(h==g||h==f||h==e||h==d||h==c||h==b||h==a)
    									    continue;
    									for(i=1;i<=9;i++){
    										if(i==h||i==g||i==f||i==e||i==d||i==c||i==b||i==a)
    										    continue;
                                            int num1=a*c*(g*100+h*10+i);
                                            int num2=b*(g*100+h*10+i);
                                            int num3=c*(d*100+e*10+f);
                                            int num4=10*c*(g*100+h*10+i);
                                            if(num1+num2+num3==num4)
                                                num++;
    									}   
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	printf("%d",num);
        return 0;
    }
    

    2016年第六题方格填数

    方格填数

    如下的10个格子
    +--+--+--+
    | | | |
    +--+--+--+--+
    | | | | |
    +--+--+--+--+
    | | | |
    +--+--+--+

    (如果显示有问题,也可以参看【图1.jpg】)

    填入0~9的数字。要求:连续的两个数字不能相邻。
    (左右、上下、对角都算相邻)

    一共有多少种可能的填数方案?

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

    img

    #include<stdio.h>
    
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int ans=0;
    
    int check(){
        if(abs(a[1]-a[0])==1||//abs取绝对值少一半代码量 
            abs(a[2]-a[1])==1|| 
            abs(a[3]-a[4])==1|| 
            abs(a[4]-a[5])==1|| 
            abs(a[5]-a[6])==1|| 
            abs(a[7]-a[8])==1|| 
            abs(a[8]-a[9])==1|| //左右不相邻 
            
            abs(a[3]-a[7])==1|| 
            abs(a[0]-a[4])==1|| 
            abs(a[4]-a[8])==1|| 
            abs(a[1]-a[5])==1|| 
            abs(a[5]-a[9])==1|| 
            abs(a[2]-a[6])==1|| //上下不相邻 
            
            abs(a[3]-a[8])==1|| 
            abs(a[9]-a[4])==1|| 
            abs(a[0]-a[5])==1|| 
            abs(a[1]-a[6])==1|| 
            abs(a[0]-a[3])==1|| 
            abs(a[6]-a[9])==1||  
            abs(a[2]-a[5])==1|| 
            abs(a[1]-a[4])==1|| 
            abs(a[4]-a[7])==1|| 
            abs(a[5]-a[8])==1 //对角不相邻 
        ) return 0;
        return 1; 
    } 
    
    void f(int k){
    	int i;
        if(k==10){
            if(check()) ans++;
        }
        for(i=k;i<10;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);
        printf("%d",ans);
    }
    

    2016年第八题四平方和

    四平方和

    四平方和定理,又称为拉格朗日定理:
    每个正整数都可以表示为至多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 , 不能通过工程设置而省略常用头文件。

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

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	int n,i,j,k;
    	int flag = 0;
    	scanf("%d",&n);
    	for(i = 0 ; i * i <= n ; i ++)
    	{
    		for(j = 0 ; j * j <= n ; j ++){
    			for(k = 0 ; k * k <= n ; k ++)
    			{
    				int temp = n - i*i - j*j - k*k;
    				double l = sqrt((double) temp);
    				if(l == (int)l )
    				{
    					printf("%d %d %d %d
    ",i,j,k,(int)l);
    					flag = 1;
    					break;
    				}
    			}
    			if(flag)break;
    		}
    		if(flag)break;
    	}
    	return 0;
    }
    

    2016年第九题交换瓶子

    交换瓶子

    有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 , 不能通过工程设置而省略常用头文件。

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

    #include <stdio.h>
    #include <math.h>
    int arr[10010];
    int flag[10010];
    int main()
    {
    	int ans = 0;
    	int n,i;
    	scanf("%d",&n);
    	for(i = 1 ; i <= n ; i ++) scanf("%d",&arr[i]);
    	for(i = 1 ; i <= n ; i ++ )flag[arr[i]] = i;
    	for(i = 1 ; i <= n ; i ++)
    	{
    		if( i != arr[i] )
    		{
    			int x = arr[i];
    			arr[i] ^= arr[flag[i]] ^= arr[i] ^= arr[flag[i]];
    			flag[i] ^= flag[x] ^= flag[i] ^= flag[x];
    			ans ++;
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    

    2017年第二题等差素数列

    标题:等差素数列

    2,3,5,7,11,13,....是素数序列。
    类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
    上边的数列公差为30,长度为6。

    2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
    这是数论领域一项惊人的成果!

    有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

    长度为10的等差素数列,其公差最小值是多少?

    注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

    #include<stdio.h>
    
    int isPrime(int n)    //判断是否为素数 
    {
        if(n == 0 || n == 1)
            return 0;
        if(n == 2)
            return 1;
            int i;
        for(i = 2; i < n; ++i)
        {
            if(n % i == 0)
                return 0;
        } 
        return 1;
    
    }
    
    int prime[100000];    //用于保存所有素数 
    
    int main()
    {
        int index = 0,i,d;
        for(i = 2; i <= 100000; ++i)
        {
            if(isPrime(i))
            {
                prime[index] = i;    //将素数都保存在prime数组中 
                index++;
            }    
        }
        
        //对素数数组中的所有数进行枚举
        for(i = 0; i <= index; ++i)    //i表示素数数组的下标 
        {
            for(d = 3; d <= 500; ++d)    //d为公差 
            {
                int j;
                //首先判断prime[i]+d是否是素数,如果是,继续判断prime[i]+2*d是否是素数,依次类推,连续10次 
                for(j = 0; j < 10; ++j)    
                    if(!isPrime(prime[i] + j*d))
                        break;
                
                if(j == 10)
                {
                    printf("%d
    ",d);
                    return 0; 
                } 
            }
        } 
        
        
        return 0;
    } 
    

    2017年第三题承压计算

    标题:承压计算

    X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

    每块金属原料的外形、尺寸完全一致,但重量不同。
    金属材料被严格地堆放成金字塔形。

                             7 
                            5 8 
                           7 8 8 
                          9 2 7 2 
                         8 1 4 9 1 
                        8 1 8 8 4 1 
                       7 9 6 1 4 5 4 
                      5 6 5 5 6 9 5 6 
                     5 5 4 7 9 3 5 5 1 
                    7 5 7 9 7 4 7 3 3 1 
                   4 6 4 5 5 8 8 3 2 4 3 
                  1 1 3 3 1 6 6 5 5 4 4 2 
                 9 9 9 2 1 9 1 9 2 9 5 7 9 
                4 3 3 7 7 9 3 6 1 3 8 8 3 7 
               3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
              8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
             8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
            2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
           7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
          9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
         5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
        6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
       2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
      7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
     1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
    2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 
    

    7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
    7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
    5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
    X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

    其中的数字代表金属块的重量(计量单位较大)。
    最下一层的X代表30台极高精度的电子秤。

    假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
    最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
    电子秤的计量单位很小,所以显示的数字很大。

    工作人员发现,其中读数最小的电子秤的示数为:2086458231

    请你推算出:读数最大的电子秤的示数为多少?

    注意:需要提交的是一个整数,不要填写任何多余的内容。

    #include<stdio.h>
    	double a[30][30]={
    							{7 },
                                {5, 8} ,
                               {7, 8,8 },
                              {9, 2, 7, 2}, 
                             {8, 1,4, 9, 1 },
                            {8, 1 ,8,8 ,4,1 },
                           {7, 9, 6 ,1, 4 ,5, 4}, 
                          {5, 6, 5, 5, 6, 9 ,5, 6}, 
                         {5,5, 4, 7, 9, 3, 5, 5,1 },
                        {7, 5 ,7, 9, 7, 4, 7, 3, 3,1}, 
                       {4, 6,4, 5, 5, 8 ,8, 3, 2, 4, 3}, 
                      {1 ,1 ,3 ,3 ,1 ,6 ,6 ,5, 5, 4, 4, 2}, 
                     {9 ,9 ,9 ,2 ,1 ,9 ,1 ,9 ,2 ,9 ,5 ,7 ,9}, 
                    {4 ,3 ,3 ,7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7}, 
                   {3 ,6 ,8 ,1 ,5 ,3 ,9 ,5 ,8 ,3 ,8 ,1 ,8 ,3 ,3}, 
                  {8 ,3 ,2 ,3, 3, 5, 5, 8, 5, 4, 2, 8 ,6 ,7 ,6, 9}, 
                 {8 ,1 ,8 ,1 ,8 ,4 ,6 ,2 ,2 ,1 ,7 ,9 ,4 ,2 ,3 ,3 ,4}, 
                {2 ,8 ,4 ,2 ,2 ,9 ,9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9}, 
               {7 ,9 ,7 ,4 ,9 ,7 ,6 ,6 ,2 ,8 ,9 ,4 ,1 ,8 ,1 ,7 ,2 ,1 ,6}, 
              {9, 2, 8, 6, 4, 2, 7, 9 ,5 ,4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3}, 
             {5 ,2 ,1 ,6 ,7 ,9 ,3 ,2 ,8 ,9 ,5 ,5 ,6 ,6 ,6 ,2 ,1 ,8 ,7 ,9 ,9}, 
            {6 ,7 ,1 ,8 ,8 ,7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4}, 
           {2 ,2 ,6 ,3 ,5 ,3, 4 ,9 ,2 ,4 ,5 ,7 ,6 ,6 ,3 ,2 ,7 ,2 ,4 ,8 ,5 ,5 ,4}, 
          {7 ,4 ,4 ,5 ,8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6}, 
         {1 ,2 ,4 ,1 ,3 ,3 ,5 ,3 ,4 ,9 ,6 ,3 ,8 ,6 ,5 ,9 ,1 ,5 ,3 ,2 ,6 ,8 ,8 ,5 ,3}, 
        {2 ,2 ,7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8}, 
       {7 ,7 ,7 ,9 ,7 ,5 ,2 ,7 ,9 ,2 ,5 ,1 ,9 ,2 ,6 ,5, 3 ,9 ,3 ,5 ,7 ,3 ,5 ,4 ,2 ,8 ,9,},
      {7 ,7, 6, 6 ,8 ,7 ,5 ,5 ,8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6} ,
     {5 ,9 ,4 ,5 ,5 ,7 ,5 ,5 ,6 ,3 ,5 ,3 ,9 ,5 ,8 ,9 ,5 ,4 ,1 ,2 ,6 ,1 ,4 ,3 ,5 ,3 ,2 ,4 ,1} 
    	};
    int main()
    {
    	int i,j;
    	double max=0,min=9999999;
    	for(i=1;i<=29;i++)
    		for(j=0;j<=i;j++)
    		{
    			if(j==0)
    				a[i][j]+=a[i-1][0]/2.0;
    			else
    			{
    				a[i][j]+=a[i-1][j-1]/2.0+a[i-1][j]/2.0;
    			}
    		}
    	for(i=0;i<=29;i++)
    	{
    		if(a[29][i]<min)
    			min=a[29][i];
    		if(a[29][i]>max)
    			max=a[29][i];
    	}
    	printf("%lf
    ",2086458231/min*max);
    	return 0;
    }
    

    2017年第六题日期问题

    标题:日期问题

    小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

    比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

    给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

    输入

    一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)

    输入

    输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。

    样例输入

    02/03/04

    样例输出

    2002-03-04
    2004-02-03
    2004-03-02

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 1000ms

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

    注意:
    main函数需要返回0;
    只使用ANSI C/ANSI C++ 标准;
    不要调用依赖于编译环境或操作系统的特殊函数。
    所有依赖的函数必须明确地在源文件中 #include
    不能通过工程设置而省略常用头文件。

    提交程序时,注意选择所期望的语言类型和编译器类型。

    #include <stdio.h>
    //闰年29天 
    int isLeap(int year)
    {
    	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
    
    int main()
    {
    	int year, ans = 0;
    	//闰年的:每年一日到该月13日的天数 
    	int Leap[] = { 12, 31 + 12, 31 + 29 + 12, 31 + 29 + 31 + 12, 31 + 29 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 12,
    		31 + 29 + 31 + 30 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 12,
    		31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 12 };
    	//平年的:每年一日到该月13日的天数 
    	int not_Leap[] = { 12, 31 + 12, 31 + 28 + 12, 31 + 28 + 31 + 12, 31 + 28 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 12,
    		31 + 28 + 31 + 30 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 12,
    		31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 12 };
    
    	scanf("%d", &year);
    	int i;
    	if (isLeap(year))
    	{
    		for (i = 0; i < 12; i++)
    		{
    			if (((year - 1) * 365 + (year - 1) / 4 - year / 100 + year / 400 + Leap[i] + 1) % 7 == 5) {
    				printf("%d-%d-13
    ", year, i + 1);
    				ans++;
    			}
    		}
    	}
    	else
    	{
    		for (i = 0; i < 12; i++)
    		{
    			if (((year - 1) * 365 + (year) / 4 - year / 100 + year / 400 + not_Leap[i] + 1) % 7 == 5)
    			{
    				printf("%d-%d-13
    ", year, i + 1);
    				ans++;
    			}
    		}
    	}
    	printf("%d
    ", ans);
    	return 0;
    }
    

    2018年第一题第几天

    标题:第几天
    2000年的1月1日,是那一年的第1天。
    那么,2000年的5月4日,是那一年的第几天?
    注意:需要提交的是一个整数,不要填写任何多余内容。

    #include<stdio.h>
    int main()
    {
    	int year,month,day,i,j;
    	int count = 0;
    	int months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    	printf("请输入年月日");
    	scanf("%d%d%d",&year,&month,&day);
    	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    	{
    		months[1] = 29;
    	}
    	for (i = 0; i < month;i++)
    	{
    		for (j = 0; j < months[i];j++)
    		{
    			count++;
    			if (i==month-1&&j==day-1)
    			{
    				break;
    			}
    		}
    	}
    	printf("%d",count);
    	return 0;
    }
    

    2019年第二题年号子串

    小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。 请问 2019 对应的字符串是什么?

    #include <stdio.h>
    
    int main()
    {
    	char a,b,c;
        for (a = 'A'; a <= 'Z'; a ++)
            for (b = 'A'; b <= 'Z'; b ++)
                for (c = 'A'; c <= 'Z'; c ++)
                    if ((a-'A'+1)*26*26 + (b-'A'+1)*26 + (c-'A'+1) == 2019)
                        printf("%c %c %c",a,b,c);
    						return 0;
    }
    

    2019年第三题数列求值

    【问题描述】 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写 多余的内容将无法得分。

    #include <stdio.h>
    int a[22000000]={0,1,1,1};
     
    int main()
    {
     
        int i;
        a[1]=1;a[2]=1;a[3]=1;
        for(i=4;i<=20190324;i++)
        {
            a[i]=(a[i-1]%10000+a[i-2]%10000+a[i-3]%10000)%10000;
        }
     
        printf("%d
    ",a[20190324]);
        return 0;
    }
    
    

    2019年第四题数的分解

    【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    #include <stdio.h>
    int Check(int num)
    {
        while(num)
        {
            if (num % 10 == 2 || num % 10 == 4)
                return 0;
            num /= 10;
        }
        return 1;
    }
    
    int main()
    {
        int N = 2019,i,j;
        int ans = 0;
        for (i = 1; i < N / 3; ++i)
            if (Check(i))
                for (j = i + 1; N - i - j > j; ++j)
                    if (Check(j) && Check(N - i - j))
                        ans++;
        printf("%d",ans);
        return 0;
    }
    

    2019年第六题特别数的和

    【问题描述】 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少?
    【输入格式】
    输入一行包含两个整数 n。
    【输出格式】
    输出一行,包含一个整数,表示满足条件的数的和。
    【样例输入】 40
    【样例输出】 574
    【评测用例规模与约定】 对于 20% 的评测用例,1≤n≤10。 对于 50% 的评测用例,1≤n≤100。 对于 80% 的评测用例,1≤n≤1000。 对于所有评测用例,1≤n≤10000。

    #include <stdio.h>
    
    int n;
    int check(int num)
    {
        while (num)
        {
            int a = num % 10;
            if (a == 2 || a == 0 || a == 1 || a == 9)
                return 0;
            num /= 10;
        }
        return 1;
    }
    
    int main()
    {
    	int n,i;
        scanf("%d",&n);
        long long ans = 0;
        for (i = 1; i <= n; i++)
            if (!check(i))
                ans += i;
        printf("%d",ans);
        return 0;
    }
    
  • 相关阅读:
    简要概括java技术体系
    我的学习之旅
    Ubuntu18.04系统执行语句时出现错误Failed to load module "canberra-gtk-module"
    USRPX310 在GNU Radio上更改通道A或B
    ubuntu18.04 安装UHD+GNU Radio教程
    安装WIN10+Ubuntu18.04安装教程(实测有效)
    信道编码
    IQ基础
    清除LabVIEW中波形图表或波形图中的历史数据
    LabVIEW中的波形图表(Chart)与波形图(Graph)
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/12739262.html
Copyright © 2011-2022 走看看