蓝桥历年真题解法类似的题

日期类

第四届

第一题:

题目标题: 高斯日记    大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

高斯获得博士学位的那天日记上标着:8113  

请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

请严格按照格式,通过浏览器提交答案。

注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。

方法一 excel

在excel中,只能计算1900年1月1日到9999年12月30日两个日期的差


方法二:电脑自带的计算器


方法三:

代码计算:

#include<stdio.h>
int days1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y=1777,m,d;
int sum=8113;
if(y%4==0&y%100!=0||y%400==0)
{
for(int i=5;i<=12;i++)
sum-=days2[i];
}
else
{
for(int i=5;i<=12;i++)
   sum-=days1[i];
}
y=1778;
while(sum>365)
{
y++;
if(y%4==0&y%100!=0||y%400==0)
sum-=366;
else
sum-=365;
}
m=1;
if(y%4==0&y%100!=0||y%400==0)
{
while(sum>31)
{
sum-=days2[m];
m++;
}
}
else
{
while(sum>31)
{
sum-=days1[m];
m++;
}
}
printf("%d-",y);
if(m<10)
printf("0%d-",m);
else
printf("%d-",m);
if(sum<10)
printf("0%d-\n",sum);
else
printf("%d\n",sum);
return 0;

第六届

2、星系炸弹 

在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 days1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y,m;
int shengyu=1000-(30-9)-31;
y=2015;
while(shengyu>365)
{

if(y%4==0&y%100!=0||y%400==0)
shengyu-=366;
else
shengyu-=365;
y++;
}
if(y%4==0&y%100!=0||y%400==0)
{
m=1;
while(shengyu>29)
{
shengyu-=days2[m];
m++;
}
printf("%d-%d-%d\n",y,m,shengyu);
}
else
{
m=1;
while(shengyu>28)
{
shengyu-=days1[m];
m++;
}
}
printf("%d-",y);
if(m<10)
printf("0%d-",m);
else
printf("%d-",m);
if(shengyu<10)
printf("0%d-\n",shengyu);
else
printf("%d\n",shengyu);
return 0;

                                                                                        我   是   分   割   线                                                                                                            

暴力

第三届

第二题

福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:

ABCDE * ? = EDCBA

他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”

华生:“我猜也是!”

于是,两人沉默了好久,还是没有算出合适的结果来。

请你利用计算机的优势,找到破解的答案。

把 ABCDE 所代表的数字写出来。

答案写在“解答.txt”中,不要写在这里!

代码如下 :

#include<stdio.h>  
int main()  
{  
    int a,b,c,d,e,f;  
    for(a=1; a<10; a++)  
    {  
        for(b=0; b<10; b++)  
        {  
            if(b==a)  
                continue;  
            for(c=0; c<10; c++)  
            {  
                if(c==a||c==b)  
                    continue;  
                for(d=0; 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;  
                        for(f=0; f<10; f++)  
                        {  
                            if(f==a||f==b||f==c||f==d||f==e)  
                                continue;  
                            if((a*10000+b*1000+c*100+d*10+e)*f==(e*10000+d*1000+c*100+b*10+a))  
                                printf("%d %d %d %d %d\n",a,b,c,d,e);  
                        }  
                    }  
                }  
            }  
        }  
    }  
    return 0;  

}  

第四届

第二题:

标题: 马虎的算式

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 x 495 = ?

 他却给抄成了:396 x 45 = ?

 但结果却很戏剧性,他的答案竟然是对的!!

因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

 能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。

注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。

代码如下:

#include<stdio.h>  
int main()  
{  
    int a,b,c,d,e,ans=0;  
    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==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))  
                            ans++;  
                    }  
                }  
            }  
        }  
    }  
    printf("%d\n",ans);  
    return 0;  

}  

第五届

6.标题:奇怪的分式

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

1/4 乘以 8/5 

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

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

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

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

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

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

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


和以上两题题型类似 ,但是题目中不计分子分母相同的情况

代码如下:

#include<stdio.h>  
int main()  
{  
    double x,y,z,k;  
    int ans=0;  
    for(x=1.0; x<=9.0; x++)  
        for(y=1.0; y<=9.0; y++)  
            for(z=1.0; z<=9.0; z++)  
                for(k=1.0; k<=9.0; k++)  
                {  
                    if(x==y&&z==k)  
                        continue;  
                    if((x*z)/(y*k)==(10*x+z)/(10*y+k))  
                        ans++;  
                }  
    printf("%d\n",ans);  
    return 0;  
}  

第六届

3、三羊献瑞 

观察下面的加法算式: 

      祥 瑞生辉

  +   三羊献瑞

-------------------

   三 羊生瑞气 

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

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

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


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

C++库中有一个全排列函数next_permutation()

#include <cstdio>        //如此用法,输入输出快  
 #include <algorithm>    
using namespace std;    
    
int main() {    
    int a[10];    
    for (int i = 0; i < 10; i++) a[i] = i;    
    
    do {    
        if (!a[2] || !a[6]) continue;    
        int x =a[2]*1000 + a[3]*100 + a[4]*10 + a[5];    
        int y =a[6]*1000 + a[7]*100 + a[8]*10 + a[3];    
        int z = a[6]*10000 + a[7]*1000 + a[4]*100 + a[3]*10 + a[9];    
        if (x + y == z) printf("%d + %d = %d\n", x, y, z);    
    } while (next_permutation(a, a+10));    
    
    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 是另一种解法。

这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

代码如下:

#include<stdio.h>
int main(){
    
    int A,B,C,D,E,F,G,H,I;
    
    int sum1,sum2,sum3,sum4;
    
    int ans;
    
    ans=0;
    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==A||E==B||E==C||E==D)continue;
                        for(F=1;F<=9;++F){
                            if(F==A||F==B||F==C||F==D||F==E)continue;
                            for(G=1;G<=9;++G){
                                if(G==A||G==B||G==C||G==D||G==E||G==F)continue;
                                for(H=1;H<=9;++H){
                                    if(H==A||H==B||H==C||H==D||H==E||H==F||H==G)continue;
                                    for(I=1;I<=9;++I){
                                        if(I==A||I==B||I==C||I==D||I==E||I==F||I==G||I==H)continue;
                                        
                                        sum1=A*C*(G*100+H*10+I);
                                        sum2=B*(G*100+H*10+I);
                                        sum3=(D*100+E*10+F)*C;
                                        sum4=10*C*(G*100+H*10+I);
                                        
                                        if(sum1+sum2+sum3==sum4){
                                            
                                            ++ans;
                                        }
                                        
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    printf("%d\n",ans);
    
    return 0;
}

当然也可以使用全排列函数

                                                                  我 是 分 割  线                                                                          

第四届

第八题


题目标题:翻硬币
小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

 比如,可能情形是:**oo***oooo

 如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:   
程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
程序输出:
一个整数,表示最小操作步数
例如:
用户输入:
**********
o****o****

程序应该输出:

5

再例如:

用户输入:
*o**o***o***
*o***o**o***

程序应该输出:

1

资源约定:

峰值内存消耗 < 64M
CPU消耗  < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

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

代码如下:

#include<cstdio>  
#include<cstring>  
using namespace std;  
int main()  
{  
    char a[1000+5],b[1000+5];  
    int ans=0,pos[1000+5],p=0;  
    scanf("%s%s",a,b);  
    int l=strlen(a);  
    for(int i=0; i<l; i++)  
        if(a[i]!=b[i])  
            pos[p++]=i;  
    for(int i=1; i<p; i++,i++)  
        ans+=pos[i]-pos[i-1];  
    printf("%d\n",ans);  
    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>, 不能通过工程设置而省略常用头文件。

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

代码如下:

#include <cstdio>  
int pos[10010];  
inline void swap(int a,int b)  
{  
    int t = pos[a];  
    pos[a] = pos[b];  
    pos[b] = t;  
}  
int main()  
{  
    int n;  
    scanf("%d",&n);  
    for(int i = 1;i<=n;i++)  
        scanf("%d",pos+i);  
    int ans = 0;  
    for(int i=1;i<=n;i++)  
    {  
        while(pos[i] != i)  
        {  
            swap(i,pos[i]);  
            ans ++ ;  
        }  
    }  
    printf("%d\n",ans);   
    return 0;  

}  

                                              我 是 分 割 线                                                    

第七届

7. 剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。



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

第八届

第四题

标题:方格分割

6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。

请提交该整数,不要填写任何多余的内容或说明文字
DFS  就不多做解释了   用DFS可以解决不少题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值