第四次周賽題目總結

題目總鏈接:

https://nuoyanli.com/contest/32/problems

A:YZJ的牛肉乾

題目鏈接:

https://nuoyanli.com/contest/32/problem/A

題面:

在這裏插入圖片描述

題意:

多組輸入,先輸入一個n,代表字符串的長度,這個字符串只能有Y,Z,J三個字母組成,其中Z,Z不能連續出現在一起。輸出有多少中塗法。

思路:

我們先觀察 第一項爲3,第二項爲8,第三項的方案數位22,此時第三項的值爲前兩項的值的和乘以2。此時我們猜測規律是 除前兩項之外,某項之和等於前兩項之和的二倍其實原理我也不清楚 就找規律吧。

參考代碼:


#include<stdio.h>

int main()
{
    long long int a[45];
    a[1] = 3;
    a[2] = 8;
    for(int i = 3;i <40;i++)
    {
        a[i] = 2*(a[i-1] + a[i-2]);
    }

    int n;
    while (scanf("%d",&n)!=EOF)
    {
        printf("%lld\n",a[n]);
    }


    return 0;
}

B:掃雷

題目鏈接:

https://nuoyanli.com/contest/28/problem/B

題面:

在這裏插入圖片描述

題意:

輸入兩個整數n,m,代表n行n列,其中字符*代表雷,我們需要在沒雷的地方顯示這個沒雷的地方的8個方向上存不存在雷,在沒雷的位置顯示出8個方向中的雷的個數。

思路:

這道題目我是用的相當暴力的方法,其實有簡單的辦法但是比賽的時候沒有想到(還是太垃圾了) 我們就是特判第一行,最後一行,第一列,最後一列,然後其他的都是判斷8個方向,這幾個需要判斷的方向不同所以特判。我的思路就是一句話麻煩。

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,i,j;
    char ch;
    scanf("%d %d",&n,&m);
    scanf("%c",&ch);
    char a[1000][1000];
    for(i=0;i<=n+10;i++)
    {
        for(j=0;j<=m+10;j++)
        {
            a[i][j]='0';
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {

            scanf("%c",&a[i][j]);
            if(a[i][j]!='*')//把不爲雷的位置全部請爲0字符,方便之後的顯示出雷的個數。
                a[i][j]='0';
        }
        scanf("%c",&ch);
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(i!=0&&j!=0)//特判的情況
            {
                if(a[i][j]=='*')//暴力判斷。。。。。
                {
                    if(a[i-1][j-1]!='*')
                    {
                        a[i-1][j-1]=a[i-1][j-1]+1;
                    }
                    if(a[i-1][j]!='*')
                    {
                        a[i-1][j]=a[i-1][j]+1;
                    }
                    if(a[i-1][j+1]!='*')
                    {
                        a[i-1][j+1]=a[i-1][j+1]+1;
                    }
                    if(a[i][j-1]!='*')
                    {
                        a[i][j-1]=a[i][j-1]+1;
                    }
                    if(a[i][j+1]!='*')
                    {
                        a[i][j+1]=a[i][j+1]+1;
                    }
                    if(a[i+1][j-1]!='*')
                    {
                        a[i+1][j-1]=a[i+1][j-1]+1;
                    }
                    if(a[i+1][j]!='*')
                    {
                        a[i+1][j]=a[i+1][j]+1;
                    }
                    if(a[i+1][j+1]!='*')
                    {
                        a[i+1][j+1]=a[i+1][j+1]+1;
                    }

                }
            }
            if(i==0&&j==0)
            {
                if(a[i][j]=='*')
                {
                    if(a[i+1][j]!='*')
                    {
                        a[i+1][j]=a[i+1][j]+1;
                    }
                    if(a[i+1][j+1]!='*')
                    {
                        a[i+1][j+1]=a[i+1][j+1]+1;
                    }
                    if(a[i][j+1]!='*')
                    {
                        a[i][j+1]=a[i][j+1]+1;
                    }
                }
            }
            if(i==0&&j!=0)
            {
                if(a[i][j]=='*')
                {
                    if(a[i][j-1]!='*')
                    {
                        a[i][j-1]=a[i][j-1]+1;
                    }
                    if(a[i][j+1]!='*')
                    {
                        a[i][j+1]=a[i][j+1]+1;
                    }
                    if(a[i+1][j-1]!='*')
                    {
                        a[i+1][j-1]=a[i+1][j-1]+1;
                    }
                    if(a[i+1][j]!='*')
                    {
                        a[i+1][j]=a[i+1][j]+1;
                    }
                    if(a[i+1][j+1]!='*')
                    {
                        a[i+1][j+1]=a[i+1][j+1]+1;
                    }

                }
            }
            if(j==0&&i!=0)
            {
                if(a[i][j]=='*')
                {

                    if(a[i-1][j]!='*')
                    {
                        a[i-1][j]=a[i-1][j]+1;
                    }
                    if(a[i-1][j+1]!='*')
                    {
                        a[i-1][j+1]=a[i-1][j+1]+1;
                    }
                    if(a[i][j+1]!='*')
                    {
                        a[i][j+1]=a[i][j+1]+1;
                    }
                    if(a[i+1][j]!='*')
                    {
                        a[i+1][j]=a[i+1][j]+1;
                    }
                    if(a[i+1][j+1]!='*')
                    {
                        a[i+1][j+1]=a[i+1][j+1]+1;
                    }
                }
            }

        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("%c",a[i][j]);
        }
        if(i!=n-1) printf("\n");
    }
}


C.簽到題它又來了

題目鏈接:

https://nuoyanli.com/contest/28/problem/C

題面:

在這裏插入圖片描述

思路:

這道題目其實也就是一個簡單的結構體排序,這種題目我之前的題解有詳細的分析,這裏就不詳細分析了,我這次只要說一下我去重的方法,根據排序結束後,我們第一個數是一定會輸出的,這時候我們就只需要不斷判斷後面一位是否與前一位相等,如果相等就不輸出,如果不相同,就正常輸出,這時候就完成了去重的工作。其他的思路基本就是之前題目結構體排序的思維。

參考代碼:


#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<math.h>

#include<algorithm>

using namespace std;

struct cfx

{

    int bh;

    int c;

    int k;

}a[100000];

bool cmp(cfx a,cfx b)//定義排序方式的函數

{

    if(a.bh==b.bh)

    {

        if(a.c==b.c)

        {

            return a.k<b.k;

        }

        else

            return a.c<b.c;

    }

    else

        return a.bh<b.bh;

}

int main()

{

	int n,m,i,t;

	scanf("%d",&n);

	while(n--)

    {

        int m;

        scanf("%d",&m);

        for(i=0;i<m;i++)

        {

            scanf("%d%d%d",&a[i].bh,&a[i].c,&a[i].k);

            if(a[i].c<a[i].k)//這個if的作用是將c中存儲的一定是長的那一邊,即就是長,而k中的存儲的爲寬。

            {

                t=a[i].c;

                a[i].c=a[i].k;

                a[i].k=t;

            }

        }

        sort(a,a+m,cmp);

        printf("%d %d %d\n",a[0].bh,a[0].c,a[0].k);

        for(i=1;i<m;i++)

        {

            if(a[i].bh==a[i-1].bh&&a[i].c==a[i-1].c&&a[i].k==a[i-1].k)//這是判斷去重重複的操作

            {



            }

            else

                printf("%d %d %d\n",a[i].bh,a[i].c,a[i].k);

        }

    }

	return 0;

}

D:萬德隆購物

題目鏈接:

https://nuoyanli.com/contest/28/problem/D

題面:

在這裏插入圖片描述

思路:

在這裏插入圖片描述

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,sum;
    scanf("%d%d",&n,&m);
    sum=(2*n*m)/(m+n);
    printf("%d",sum);

}

E:三生三世

題目鏈接:

https://nuoyanli.com/contest/28/problem/E

題面:

在這裏插入圖片描述

思路:

這道題目我們首先要特判兩個字符串完全相等的情況。然後再將兩個字符串繼續sort排序,然後在接着判斷兩個字符串是否完全相等,如果完全相等則就是子串,輸出yes,若不是輸出no。

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,i,j,ans=0;
    scanf("%d",&n);
    char a[n+10];
    char b[n+10];
    scanf("%s",a);
    scanf("%s",b);
    if(strcmp(a,b)==0)//判斷兩個字符是否完全相等
    {
        printf("no");
    }
    else//如果不相等就對其繼續ssort排序,如果排序之後完全相等就證明是子串。
    {
        sort(a,a+n);
        sort(b,b+n);//對兩個字符串繼續sort排序
        if(strcmp(a,b)==0)//判斷排序之後的字符串是否完全相等
        {
            printf("yes");
        }
        else
        {
            printf("no");
        }
    }
     return 0;
}

F:賣火柴的lly

題目鏈接:

https://nuoyanli.com/contest/28/problem/F

題面:

在這裏插入圖片描述

題意:

從0到9對應不同的火柴數目,輸入一個數,代表我們有的火柴數,接下來我們要使得已有的火柴數正好滿足一個等式滿足a+b=c,我們需要輸出這個數目下的火柴可以組成多少個這樣的等式,其他+,=分別使用兩個火柴數目。

思路:

這道題目我們最難實現的就是數字的相加的等式要轉換爲火柴數目的相加,而實現這個我們可以通過定義一個函數,我們先得出滿足a+b=c,然後定義一個函數使得數字改爲對應的火柴數目,然後再判斷火柴數目是否滿足剛好等於給定的火柴數目,如果滿足就加1.這道題目思路就這樣,然後就是代碼實現了。

參考代碼:

#include <cstdio>
int fun(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=x/10;
    }
    ans+=f[x];//將數字對應的需要的火柴數目求出來
    return ans;
}
int main()
{
    int a,b,c,m,ans=0;
    scanf("%d",&m);
    for (a = 0; a<= 1111; a++)
    {

        for(b=0; b<= 1111; b++)
        {
            c=a+b;
            if((fun(a)+fun(b)+fun(c))==m-4)//判斷是否存在等式使得a+b=c的等式需要的火柴數滿足,若滿足則加1
            {
                ans++;
            }
        }
    }
    printf("%d",ans);//輸出這個數目的火柴數目下能夠構成的等式數目
    return 0;
}

G:進位

題目鏈接:

https://nuoyanli.com/contest/28/problem/G

題面:

在這裏插入圖片描述

思路:

這道題目就是求兩個數字相加的進位次數,我們可以通過一位一位不斷的判斷,我們先判斷個位數相加,如果超過10就要進位,然後在把相加/10的數值加到10位,就只要操作3次,就可以判斷出進位的次數了。

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        int a,b,c,d,e,f,k=0,x=0,y=0;
        if(m==0&&n==0)
    {
        break;
    }

    a=m%10;//第一個數字的個位數
    b=n%10;//第二個數字的個位數
    if(a+b>=10)//判斷是否大於10需要進位
    {
        k=k+1;//進位次數加1
        x=(a+b)/10;//加到10位數的數值
    }
    c=n/10%10;
    d=m/10%10;
    if((c+d+x)>=10)//判斷前面進位需要加的數值和兩個數的十位數相加是否大於10,下面的操作基本重複
    {
        k=k+1;
        y=(c+d+x)/10;
    }
    e=n/100;
    f=m/100;
    if((e+f+y)>=10)
    {
        k=k+1;
    }
    printf("%d\n",k);
    }
}


H:最直接的題

題目鏈接:

https://nuoyanli.com/contest/28/problem/H

題面:

在這裏插入圖片描述

題意:

輸入n個數字,一個數字加2或者減2的代表爲0,加1或者減1的代價爲1,我們需要輸出花費代價最少的代價爲多少。

思路:

這道題目其實理清思路就特別簡單,我們可以把所有的數字通過不斷減2使得這些數字變成只有1或者2,這時候要使得代價最小,是不是加1減1的次數要少,而我們就只需要判斷奇數和偶數的個數大小,把個數小的轉換爲個數大的就是花費代價最小的方案了,所有這道題目其實就是判斷奇數個數和偶數個數的大小比較。

參考代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,k=0,i,m=0;
    scanf("%d",&n);
    int a[n+10];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]%2==0)
        {
            m=m+1;//計算偶數個數
        }
        else
        {
            k=k+1;//計算奇數個數
        }
    }
    if(m>k)//判斷大小
    {
        printf("%d",k);
    }
    else
    {
        printf("%d",m);
    }

    return 0;
}

I:淘寶蓋樓

題目鏈接:

https://nuoyanli.com/contest/28/problem/I

題面:

在這裏插入圖片描述

題意:

題意就是找人幫忙蓋樓,就是她一個個選擇,到每次選擇都不會選擇比自己選的等級低的人。然後輸出最後的等級。

思路:

這道題目就是簡單的累加加了一個判斷,我們需要確保你選那個一定比你前面出現過的任何數字都大,我們需要實現這個操作其實就只需要定義一個maxe,使得它一開始特別小,然後繼續判斷和賦值,就可以判斷這個數字是不是比你前面出現的數字都要大。

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    long long n,sum,i,maxe;
    scanf("%lld",&n);
    long long a[n+10];
    for(i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
    }
    sum=a[0];
    maxe=a[0];
    for(i=1;i<n;i++)
    {
        if(a[i]<maxe);
        if(a[i]>=maxe)//判斷a[i]是不是比前面的數字都大
        {
            maxe=a[i];//如果大於,把a[i]的數值賦值給maxe
            sum=sum+a[i];//同時這個人幫忙蓋樓
        }

    }
    printf("%lld",sum);//輸出最後幫忙蓋樓的等級總數

    return 0;
}


J:Belief

題目鏈接:

https://nuoyanli.com/contest/32/problem/J

題面:

在這裏插入圖片描述

思路:

白給的題,雖然是英文題,但是相當簡單啊

參考代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    long long n,sum;
    scanf("%lld",&n);
    while(n--)
    {

    printf("I love ACM,ACM is my belief!");
    if(n!=0) printf("\n");
    }
    return 0;
}

K:愛我中華

題目鏈接:

https://nuoyanli.com/contest/32/problem/K

題面:

在這裏插入圖片描述

思路:

白送的題目,就是1949+n,話不多說,代碼附上。

參考代碼

#include<stdio.h>
int main()
{
    long long n,sum;
    scanf("%lld",&n);
    sum=1949+n;
    printf("%lld",sum);
    return 0;
}

M:貨車

題目鏈接:

https://nuoyanli.com/contest/32/problem/M

題面:

在這裏插入圖片描述

題意:

輸入一個n,m分別代表倉庫中本來有的貨物個數並且倉庫中本來的貨物的編號是從1到n。接下來繼續m次操作,如果輸入1代表放入,就接着輸入一個編號。代表放入貨物的編號,如果輸入的2的話,就代表要拿出最外面的那個貨物。然後輸出最後剩餘的貨物的編號,總最外面的編號開始輸出。

思路:

這道題目就是棧的題目,這裏我是使用數組進行模擬其過程,我們首先把前面有的貨物對應的編號存儲到數組中去,然後繼續判斷,如果輸入的爲1,就繼續輸入一個數字,我們這時候就將這個數字(就是貨物對應的編號)存儲到數組中去,如果之前輸入的爲2,我們就直接減去數組的一位,實現刪除的操作。然後就這樣子判斷m次,最後把數組逆序輸出就行了。

參考代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,i,b;
    int a[10000];
    scanf("%d%d",&n,&m);
    for(i=0; i<n; i++)
    {
        a[i]=i+1;//把倉庫中本來的有的貨物先存儲到數組中去
    }
    while(m--)//進行m次操作
    {
        scanf("%d",&b);
        if(b==1)//判斷是否是放入貨物還是拿出貨物
        {
            scanf("%d",&a[n++]);//如果放入先存儲到數組中去,然後n++
        }
        if(b==2)
        {
            n=n-1;//如果有刪除就n--
        }

    }
    if(n==0)//特判倉庫中沒有貨物的情況了,就輸出no
    {
        printf("NO");
    }
    else
    {

        for(i=n-1; i>=0; i--)//逆序輸出
        {
            printf("%d ",a[i]);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章