蓝桥杯练习(第十一天)


一、天干地支

古代中国使用天干地支来记录当前的年份。

天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。

地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。

将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。

20202020 年是庚子年。

每过一年,天干和地支都会移动到下一个。例如 20212021 年是辛丑年。

每过 6060 年,天干会循环 66 轮,地支会循环 55 轮,所以天干地支纪年每 6060 年轮回一次。例如 19001900 年,19601960 年,20202020 年都是庚子年。

给定一个公元纪年的年份,请输出这一年的天干地支年份。

输入描述
输入一行包含一个正整数,表示公元年份。

其中有 ,输入的公元年份为不超过 99999999 的正整数。

输出描述
输入一行包含一个正整数,表示公元年份。

输入输出样例
示例
输入

2020
copy
输出

gengzi
copy
运行限制
最大运行时间:1s
最大运行内存: 128M

解法:
这道题没什么好说的,求余数就行。

代码:

#include <bits/stdc++.h>

using namespace std;
char a[10][10]={"geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"};
char b[12][10]={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
int main()
{
    int n;
    cin>>n;
    if(n>=2020)
    {int x=(n-2020)%10;
    int y=(n-2020)%12;
        printf("%s%s\n",a[x],b[y]);
    }
    else{
        int x=(10-(2020-n)%10)%10;
        int y=(12-(2020-n)%12)%12;
        printf("%s%s\n",a[x],b[y]);
    }

    return 0;
}

二、包子凑数

资源限制
时间限制:1.0s 内存限制:256.0MB
  小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的。
输入格式
  ----
  第一行包含一个整数N。(1 <= N <= 100)
  以下N行每行包含一个整数Ai。(1 <= Ai <= 100)
输出格式
  ----
  一个整数代表答案。如果凑不出的数目有无限多个,输出INF。

例如,
输入格式
  2
  4
  5

程序应该输出:
  6

再例如,
输入格式
  2
  4
  6

程序应该输出:
  INF

解法:
通过分析,可知枚举的上限是99*100,不会超时,所以直接用枚举+动态规划即可。此外,还可以发现一个性质,如果这些数的最大公因子大于1,那么它们会有无限多个凑不出来的数。

代码:

#include <bits/stdc++.h>

using namespace std;
int t[109];
int g[100009];
int gcd(int a,int b)
{
    int r;
    while(b!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main()
{
    int n;
    int i,j;
    int sum=0;
    cin>>n;
    g[0]=1;
    for(i=1;i<=n;i++)
    {
        cin>>t[i];
    }
    int x=t[1];
    for(i=2;i<=n;i++)
    {
        x=gcd(x,t[i]);
    }
    if(x!=1)
    printf("INF\n");
    else{
        for(i=1;i<=100000;i++)
        {int flag=0;
            for(j=1;j<=n;j++)
            {
                if(i-t[j]>=0)
                {
                    if(g[i-t[j]])
                    flag=1;
                }
            }
            if(flag==0)
            sum++;
            else{
                g[i]=1;
            }
        }
            printf("%d\n",sum);
    }

    return 0;
}

三、求值

在这里插入图片描述
解法:
该题可以用暴力解决。(能用暴力的题就用暴力吧)

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int i;
    int j;
    int x;
    int sum=0;
    for(i=7;i<=1000000;i++)
    {   sum=0;
        for(j=1;j<=sqrt(i);j++)
        {
            if(i%j==0)
            sum++;
        }
        if(i==int(sqrt(i))*int(sqrt(i)))
        {
            sum=sum*2-1;
        }
        else{
            sum=sum*2;
        }
        if(sum==100)
        {   x=i;
            break;
        }
    }
    printf("%d\n",x);
    return 0;
}

四、青蛙跳杯子

在这里插入图片描述
在这里插入图片描述
解法:
利用广搜便能求出最少的步数。

代码:

#include <bits/stdc++.h>

using namespace std;
string s1;
string s2;
int zuobiao[6]={-3,-2,-1,1,2,3};
struct node{
    int pre;//上一个位置
    int now;//它的位置
    string s3;
    int num;
};
queue<node>v;
map<string,int>vis;
int main()
{
    cin>>s1;
    cin>>s2;
    int i;
    struct node Node;
    for(i=0;i<s1.length();i++)
    {
        if(s1[i]=='*')
        {
            Node.pre=i;
            Node.now=i;
            Node.s3=s1;
            Node.num=0;
            v.push(Node);
            vis[s1]=1;
            break;
        }
    }
    while(!v.empty())
    {   Node=v.front();
        v.pop();
        int flag=0;
        for(i=0;i<s1.length();i++)
        {
            if(Node.s3[i]!=s2[i])
            flag=1;
        }
        if(flag==0)
        {
            printf("%d\n",Node.num);
            break;
        }
        for(i=0;i<6;i++)
        {
            int u=Node.now+zuobiao[i];
            if(u>=0&&u<s1.length()&&u!=Node.pre&&Node.s3[u]!='*')
            {
                struct node Node2;
                Node2.now=u;
                Node2.pre=Node.now;
                Node2.num=Node.num+1;
                string s4;
                s4=Node.s3;
                swap(s4[u],s4[Node.now]);
                Node2.s3=s4;
                if(!vis[Node2.s3])
                {
                    v.push(Node2);
                    vis[Node2.s3]=1;
                }
            }
        }
    }
    return 0;
}

总结

今天的题虽然不是很难,但有几题不太好想(第二题和第四题)。还是要好好努力才能达到自己的目标啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值