第四次周赛

YZJ的牛肉干

在这里插入图片描述
思路:
简单的递推一下以每一位字母结尾时候的符合要求的数量, fy[i]就表示以Y结尾时候长度为i的字符串有多少种, 同理,fz[i]表示以J结尾长度为i的字符串有多少种, fj[i]就是以Z结尾长度为i 的字符串有多少种。 那么 你就可以得到这么一个递推公式:

fy[i]=fy[i-1]+fz[i-1]+fj[i-1];
fz[i]=fy[i-1]+fj[i-1];
fj[i]=fy[i-1]+fz[i-1]+fj[i-1];

就以第一行为例,当第i位为Y时候,符合要求长度为i的字符串数量肯定等于分别以Y结尾长度为i-1的符 合要求字符串和以Z结尾长度为i-1的符合要求字符串数量,还有长度为i-1的以J结尾的符合要求字符串数 之和(仔细想想是不是这样),剩下两个也是相同的道理,只不过以Z结尾的时候不能再加上以Z结尾的 长度i-1的符合要求字符串,(不能出现ZZ)。 那么长度为n的符合要求字符串数量是不是就等于分别以这三个字母结尾的长度为n的字符串数量之 和。(注意这里数据范围超出int了,实际上40也超出long long范围了)
题解:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        long long i,fy[100],fz[100],fj[100];
        fy[1]=1;
        fz[1]=1;
        fj[1]=1;
        for(i=2; i<40; i++)
        {
            fy[i]=fy[i-1]+fz[i-1]+fj[i-1];
            fz[i]=fy[i-1]+fj[i-1];
            fj[i]=fy[i-1]+fz[i-1]+fj[i-1];
        }
        printf("%lld\n",fy[n]+fz[n]+fj[n]);
    }
    return 0;

扫雷

在这里插入图片描述
这道题又是四层for循环和二维数组的应用
代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
    char a[1005][1005]={'\0'};
    int i,j,n,m,ii,jj;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            scanf(" %c",&a[i][j]);
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            int ans=0;
            for(ii=i-1;ii<i+2;ii++)
            {
                for(jj=j-1;jj<j+2;jj++)
                {
                    if(a[ii][jj]=='*')
                        ans++;
                }
            }
            if(a[i][j]=='*')printf("*");
            else printf("%d",ans);
        }
         printf("\n");
    }
    return 0;
}

签到题它又来了

在这里插入图片描述
这道题是结构体的应用,只不过多了一个去重和一个长宽的判定
代码

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stack>
using namespace std;
struct people
{
    int c,k,bh;
} v[1005];
bool cmp(people x,people y)
{
    if(x.bh!=y.bh)
        return x.bh<y.bh;
    else if(x.c!=y.c)
        return x.c<y.c;
    else if(x.k!=y.k)
        return x.k<y.k;
}
int main()
{
    int n,m;
    int i;
    scanf("%d",&n);
    while (n--)
    {
    scanf("%d",&m);
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&v[i].bh,&v[i].c,&v[i].k);
            int t;
            if(v[i].c<v[i].k)
            {
                t=v[i].c;
                v[i].c=v[i].k;
                v[i].k=t;
            }
        }
        sort(v,v+m,cmp);
        for(i=0; i<m; i++)
        {
            if(v[i-1].bh!=v[i].bh||v[i-1].c!=v[i].c||v[i-1].k!=v[i].k)
                printf("%d %d %d\n",v[i].bh,v[i].c,v[i].k);
        }
    }
    return 0;

万德隆购物

在这里插入图片描述
思路: 初中物理题,分析 和电梯在整个过程中的运动情况,电梯在整个运动过程中的速度不变,可以知道 向上和向下的运动时间之比为 。由人沿电梯上下行所走的路程相等,等于同一个楼层的高度, 建立方程即可求解:
在这里插入图片描述
代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
    double n,m;
    scanf("%lf%lf",&n,&m);
    double a=(2.0*n*m)/(m+n);
    int b=a;
    printf("%d",b);
    return 0;
}

三生三世

在这里插入图片描述
题目比较长,大致意思就是说,输入两个字符串,判断他们的字符是否相同,但是他们还不能完全相同(本来我是用sort排序做的,没想到差点超时 -.- )下面看一下统筹做法(这个做法挺快的,是sort的几百倍了0.0)
代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
char a[200005],b[200005];
    int ak[2005]= {0},bk[2005]= {0},flog=0;
    int n,i;
    scanf("%d%s%s",&n,a,b);
    if(strcmp(a,b)==0)
        printf("no\n");
    else
    {
        for(i=0; i<n; ++i)
        {
            ak[a[i]-'A']++;
            bk[b[i]-'A']++;
        }
        for(i=0; i<='z'-'A'; ++i)
        {
            if(ak[i]!=bk[i])
            {
                printf("no\n");
                flog=1;
                break;
            }
        }
        if(flog==0)printf("yes\n");
    }
    return 0;
}

卖火柴的lly

在这里插入图片描述
思路:
既然是要找出形如A+B=C这样的等式,那最简单的办法就是分别枚举A,B,C。接下来的问题就是: A,B,C的枚举范围是什么呢?我们只需要在0~1111之间枚举就可以了。为什么呢?因为题目中最多 只有24根火柴棒即m<=24。除去“+”和“-”占用的4根火柴棍,那么最多剩下20根火柴棍。而0-9这十个数 字中,1需要用到的火柴棍最少,只需要2根火柴棍。而20根火柴棍最多能组成10个1。因此A+B=C这个 等式中A,B,C中任意一个数都不能超过1111。接下来就暴力求解就阔以了。
代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
int write(int x)
{
    int ans=0,f[10]={6,2,5,5,4,5,6,3,7,6};
    while (x/10!=0)
     {
        ans+=f[x%10];
        x/=10;
    }
    ans+=f[x];
    return ans;
}
int main()
{
    int n,a,b,c,ans=0;
    scanf("%d",&n);
    for(a=0;a<1111;a++)
    {
        for(b=0;b<1111;b++)
        {
            c=a+b;
            if(write(a)+write(b)+write(c)==n-4)
                ans++;
        }
    }
    printf("%d",ans);
    return 0;
}

进位

在这里插入图片描述
就是简单的加法,注意保留一下进位就行了(可以参考一下大数加法)
代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
    char a[5],b[5];
    while (~scanf("%s%s",a,b))
    {
        int i,ans=0,t=0;
        if(a[0]=='0'&&b[0]=='0')
            break;
        for(i=2; i>=0; i--)
        {
            t=(a[i]-'0'+b[i]-'0'+t);
            if(t>=10)ans++;
            t/=10;
        }
         printf("%d\n",ans);
    }
    return 0;
}

最直接的题

在这里插入图片描述
仔细思考一下就可以很快想到思路了,其实就是找奇数和偶数的最小值
代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
    int n,a=0,b=0,i,m;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&m);
        if(m%2==0)
            a++;
        else b++;
    }
    if(a>=b)printf("%d",b);
    else printf("%d",a);
    return 0;
}

淘宝盖楼

在这里插入图片描述
学姐又开始盖楼了,你们的等级都是多少呢?快来帮助学姐吧!(虽然双十一已经结束了QAQ),大家是不是都已经开始吃土了呢
代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    int n,i,maxi=-100;
    long long ans=0,a;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%lld",&a);
         if(a>=maxi)
         {
             maxi=a;
             ans+=maxi;
         }
    }
    printf("%lld",ans);
    return 0;
}

Belief

在这里插入图片描述
直接看代码吧

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        printf("I love ACM,ACM is my belief!\n");
    }
    return 0;
}

爱我中华

在这里插入图片描述
直接看代码,还是签到题
代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d",1949+n);
    return 0;
}

货车

在这里插入图片描述
这是栈的应用,不算太难,会用就能解
代码:

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stack>
using namespace std;
int main()
{
    int a,i,n,j,m;
    stack<int>q;
    scanf("%d%d",&n,&m);
     for(i=1; i<=n; i++)
    {
//        scanf("%d",&a);
        q.push(i);
    }
    for(i=1; i<=m; i++)
    {
        scanf("%d",&j);
        if(j==1)
        {
            scanf("%d",&a);
            q.push(a);
        }
        else
        {
            if(!q.empty())
            {
               q.pop();
            }
        }
    }
    if(q.empty())
        printf("NO\n");
    else
    {
        while(!q.empty())
        {
            int x=q.top();
            q.pop();
            printf("%d",x);
            printf(" ");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugarsong/article/details/103072275