1. 程式人生 > >ACM-TC工作室第一次聯合招新賽暨新生第一次月賽

ACM-TC工作室第一次聯合招新賽暨新生第一次月賽

A 你想加入ACM集訓隊嗎?

#include<stdio.h>
int main()
{
    printf("YES\n");
    return 0;
}

B 求最大值

利用桶排,計算出現過的每一個字元的個數。最後用一個for迴圈遍歷所有出現過的字元,求出ascii值與出現次數乘積最大的那一個字元。

#include<stdio.h>
#include<string.h>
int main()
{
    int num[1000];
    char s[600];
    while(scanf("%s",s)!=EOF)
    {
        int ma=-1,l=strlen(s);
        memset(num,0,sizeof(num));
        for(int i=0;i<l;i++)
            num[s[i]]++;
        for(int i=0;i<l;i++)
        {
            if(num[s[i]]*s[i]>ma)
                ma=num[s[i]]*s[i];
        }
        printf("%d\n",ma);
    }
    return 0;
}

C 去香港吧

利用結構體存放每一個出現過的字元的:字元、位置、ascii值,然後用sort排序直接排序即可。

#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
    char c;
    int num;
    int asc;
}a[10004];
bool cmp(node x,node y)
{
    if(x.asc==y.asc)
        return x.num<y.num;
    return x.asc<y.asc;
}
int main()
{
    int t,n;
    char s[10004];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        scanf("%s",s);
        for(int i=0;i<n;i++)
        {
            a[i].c=s[i];
            a[i].num=i+1;
            if(s[i]>='A'&&s[i]<='Z')
                a[i].asc=s[i]-'A';
            else
                a[i].asc=s[i]-'a';
        }
        sort(a,a+n,cmp);
        printf("%d",a[0].num);
        for(int i=1;i<n;i++)
            printf(" %d",a[i].num);
        printf("\n");
    }
    return 0;
}

D 計算清單

注意,我們要將檔案結束前的所有物體的總價全部相加,當檔案結束後,輸出答案。

#include<stdio.h>
int main()
{
    char s[100];
    double a,b,sum=0;
    while(scanf("%s %lf %lf",s,&a,&b)!=EOF)
        sum+=a*b;
    printf("%.1f\n",sum);
    return 0;
}

E riba2534的拷問

每一個數字都有他們的特點,找出這個特點,並利用這個特點判斷它的值應該是多少,然後進行a+b,輸出答案即可。

這個程式碼是先計算出每一個數字的‘#’有多少個,如果有相同個數的‘#’號,再根據他們的特定的點來判斷他們的值。

每一個數字對應的‘#’號的個數如下:

#####   ....#    #####   #####   # . . .#   #####   #####   #####   #####   #####   . . . . .   . . . . . # . . .#   ....#    . . . . #   . . . . #   # . . .#   # . . . .   # . . . .   . . . .#    # . . .#   # . . .#   . . #. .   . . . . . # . . .#   ....#    . . . . #   . . . . #   # . . .#   # . . . .   # . . . .   . . . .#    # . . .#   # . . .#   . . #. .    . . . . . # . . .#   ....#    #####   #####   #####   #####   #####   . . . .#    #####   #####   #####   ##### # . . .#   ....#    # . . . .   . . . .  . . . .#    . . . .#   # . . .#    . . . .#    # . . .#    . . . .#   . . #. .   . . . . . # . . .#   ....#    # . . . .   . . . . #   . . . .#    . . . .#   # . . .#    . . . .#    # . . .#    . . . .#   . . #. .   . . . . . #####   ....#    #####   #####   . . . .#   #####   #####    . . . .#    #####   #####   . . . . .   . . . . .   20        7         19        19          14          19        21          11           23        21        9         5

#include<stdio.h>
int main()
{
    int t,a,b,sum,flag;
    char s[7][20];
    scanf("%d",&t);
    while(t--)
    {
        sum=0,flag=0;
        for(int i=0; i<7; i++)
            scanf("%s",s[i]);
        for(int i=0; i<7; i++)
        {
            for(int j=0; j<5; j++)
            {
                if(s[i][j]=='#')
                    sum++;
            }
        }
        if(sum==20)
            a=0;
        else if(sum==7)
            a=1;
        else if(sum==19)
        {
            if(s[1][4]=='#'&&s[4][0]=='#')
                a=2;
            else if(s[1][4]=='#'&&s[4][4]=='#')
                a=3;
            else
                a=5;
        }
        else if(sum==14)
            a=4;
        else if(sum==21)
        {
            if(s[4][0]=='#')
                a=6;
            else
                a=9;
        }
        else if(sum==11)
            a=7;
        else
            a=8;
        sum=0;
        for(int i=0; i<7; i++)
        {
            for(int j=6; j<11; j++)
                if(s[i][j]=='#')
                    sum++;
        }
        if(sum==9)
            flag=1;
        sum=0;
        for(int i=0; i<7; i++)
        {
            for(int j=11; j<17; j++)
                if(s[i][j]=='#')
                    sum++;
        }
        if(sum==20)
            b=0;
        else if(sum==7)
            b=1;
        else if(sum==19)
        {
            if(s[1][16]=='#'&&s[4][12]=='#')
                b=2;
            else if(s[1][16]=='#'&&s[4][16]=='#')
                b=3;
            else
                b=5;
        }
        else if(sum==14)
            b=4;
        else if(sum==21)
        {
            if(s[4][12]=='#')
                b=6;
            else
                b=9;
        }
        else if(sum==11)
            b=7;
        else
            b=8;
        if(flag)
            printf("%d\n",a+b);
        else
            printf("%d\n",a-b);
    }
    return 0;
}

F 二進位制加法

從字串最後面往前面進行計算,然後注意進位問題和前導0問題就行了。

也可以用昨天晚上學長講的大數加法的方法來做,我就是想告訴你們可以這樣做而已。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int ans[1003],la,lb,l,k;
    char a[1003],b[1003];
    while(~scanf("%s%s",a,b))
    {
        la=strlen(a);
        lb=strlen(b);
        l=max(la,lb);
        k=0;
        memset(ans,0,sizeof(ans));
        for(int i=1; i<=l; i++)
        {
            if(la-i>=0&&lb-i>=0)
                ans[l-i]=(a[la-i]-'0')+(b[lb-i]-'0')+k;
            else if(la-i<0)
                ans[l-i]=(b[lb-i]-'0')+k;
            else
                ans[l-i]=(a[la-i]-'0')+k;
            k=ans[l-i]/2;
            ans[l-i]%=2;
        }
        if(k)
            printf("1");
        for(int i=0; i<l; i++)
        {
            if(ans[i]==0&&k==0)
                continue;
            else
            {
                printf("%d",ans[i]);
                k=1;
            }
        }
        if(k==0)
            printf("0\n");
        printf("\n");
    }
    return 0;
}

G 2D蛋糕

直接計算蛋糕的每一種邊和蛋糕的長寬關係,利用這個關係計算每一種邊的個數即可。

具體關係你畫一個圖就知道了。

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        int zero=0,one=0,two=0,three=0,four=0;
        if(a<2||b<2)
            zero=0;
        else
            zero=(a-2)*(b-2);
        if(b>1&&a>2)
            one+=(a-2)*2;
        if(a>1&&b>2)
            one+=(b-2)*2;
        if(a>1&&b>1)
            two=4;
        if(a==1&&b==1)
            four=1;
        else if(a==1||b==1)
        {
            three=2;
            two=max(a,b)-2;
        }
        printf("%d %d %d %d %d\n",zero,one,two,three,four);
    }
    return 0;
}

H 九宮格解鎖

將九宮格標記序號:

1 2 3

4 5 6

7 8 9

先用一個二維陣列a[10][10],將所有可行的路徑標記為1:如從1可以到5,那麼我們使a[1][5]=1;

利用for迴圈將字串遍歷:如果這個字元到下一個字元是可行的,將這個字元妨礙到的其它的字元標記為1,例如:本來從1到3為不可行的,但是我們如果已經使用過2,那麼把a[1][3]=1,a[3][1]=1,標記為可行。如果著一個字元到下一個字元為不可行的,直接退出for迴圈輸出NO。

1、如何判斷兩個字元是否可行?假設第一個字元化為整數是x,第二個字元化為整數是y,判斷a[x][y]是否等於1即可。

2、如何退出for迴圈?用一個flag標記,flag==0表示我們這個for迴圈執行到字串結束,flag==1表示我們提前退出for迴圈。

3、memcpy(a,b,sizeof(a))是什麼意思?讓b陣列變成與a陣列完全相同的陣列。(實在不能理解的話,就把a陣列定義在while迴圈裡面,去掉b陣列)。

#include<stdio.h>
#include<string.h>
int t;
char s[10];
int a[10][10],b[10][10]=
{
    // 1 2 3 4 5 6 7 8 9
    {0,0,0,0,0,0,0,0,0,0},//0
    {0,0,1,0,1,1,1,0,1,0},//1
    {0,1,0,1,1,1,1,1,0,1},//2
    {0,0,1,0,1,1,1,0,1,0},//3
    {0,1,1,1,0,1,0,1,1,1},//4
    {0,1,1,1,1,0,1,1,1,1},//5
    {0,1,1,1,0,1,0,1,1,1},//6
    {0,0,1,0,1,1,1,0,1,0},//7
    {0,1,0,1,1,1,1,1,0,1},//8
    {0,0,1,0,1,1,1,0,1,0}//9
};
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        memcpy(a,b,sizeof(a));
        int flag=0,l=strlen(s);
        for(int i=0; i<l-1; i++)
        {
            int x=s[i]-'0';
            int y=s[i+1]-'0';
            if(a[x][y])
            {
                if(x==2)
                {
                    a[1][3]=1;
                    a[3][1]=1;
                }
                else if(x==4)
                {
                    a[1][7]=1;
                    a[7][1]=1;
                }
                else if(x==5)
                {
                    a[1][9]=1;
                    a[2][8]=1;
                    a[3][7]=1;
                    a[4][6]=1;
                    a[6][4]=1;
                    a[7][3]=1;
                    a[8][2]=1;
                    a[9][1]=1;
                }
                else if(x==6)
                {
                    a[3][9]=1;
                    a[9][3]=1;
                }
                else if(x==8)
                {
                    a[7][9]=1;
                    a[9][7]=1;
                }
                else
                    continue;
            }
            else
            {
                flag=1;
                break;
            }
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

I 列印田字,超級簡單

找規律的題目。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m;
    char a[1003][1003];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,0,sizeof(a));
        for(int i=0; i<=n; i++)
        {
            for(int j=0; j<=m; j++)
                a[i][j]=' ';
        }
        for(int i=0; i<m; i++)
        {
            a[0][i]='*';
            a[n/2][i]='*';
            a[n-1][i]='*';
        }
        for(int i=0; i<n; i++)
        {
            a[i][0]='*';
            a[i][m/2]='*';
            a[i][m-1]='*';
        }
        for(int i=0; i<n; i++)
            printf("%s\n",a[i]);
        printf("\n");
    }
    return 0;
}

J 神奇的掛鐘

要知道從11點~12點鐘聲不會敲響,從23點到24點鐘聲也不會敲響。

直接b-a,然後判斷上面的情況出現了幾次,減去這個次數。

#include<stdio.h>
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d%d",&a,&b);
        int num=0,sum=b-a;
        while(a<b)
        {
            a++;
            if(a==12||a==24)
                num++;
        }
        printf("%d\n",sum-num);
    }
    return 0;
}