1. 程式人生 > 其它 >台州學院1024程式設計師節新生C語言大賽題解

台州學院1024程式設計師節新生C語言大賽題解

1001 排座位

由題目可知沒有兩個隊員面對面相坐,且沒有隊員相鄰相坐,由此可知每隔一個位置坐一個人;
當n為奇數時,答案為(n+1)/2,
當n為偶數時,答案為(n)/2;
因為整數除法是整除,所以答案就是(n+1)/2;

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

1002 maomeng的圖形

這題就直接找規律,直接上程式碼

#include<stdio.h>
void xing(int x){//自定義函式列印星號
    int i;
    for(i=1;i<=x;i++){
        printf(" *");
    }
}
void kong(int x){//自定義函式列印空格
    int i;
    for(i=0;i<x;i++)printf(" ");
}
int main(){
    int n,i;
    scanf("%d",&n);
    kong(n-2);
    for(i=0;i<n;i++){
        printf(" *");
    }
    printf("\n");
    for(i=2;i<=n;i++){
        kong(n-i);
        printf("*");
        kong(2*n-1+(i-2)*2);
        printf("*\n");
    }
    for(i=n-1;i>=2;i--){
        kong(n-i);
        printf("*");
        kong(2*n-1+(i-2)*2);
        printf("*\n");
    }
    kong(n-2);
    for(i=0;i<n;i++){
        printf(" *");
    }
    printf("\n");
    return 0;
}

1003 歐透與炫狗

由題意可得,找三個數字中間的數最大,對於每個數來說,只要找前面有幾個數,後面有幾個數,然後進行排列組合。
然後2重迴圈就能得出答案。因為最終的答案很大,所以要開long long。
很多人都是三重迴圈尋找三個點,這個迴圈的次數達到了1e12,所以會超時,需要減少迴圈次數。

#include<stdio.h>
int w[10010];
int main(){
    int n,i,s1,s2,j;
    long long res=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&w[i]);
    for(i=2;i<=n-1;i++){
        s1=s2=0;
        for(j=1;j<i;j++){
            if(w[j]<w[i])s1++;
        }
        for(j=i+1;j<=n;j++){
            if(w[j]<w[i])s2++;
        }
        res+=s1*s2;
    }
    printf("%lld",res);
    return 0;
}

1004 小球反彈

由題意可得,w代表的是左右方向的大小,h代表上下方向的大小。
以左右方向為例:
我們將座標軸分成無限個長度為w的區間
往左看第一個區間是從左往右的長度,第二個區間是從右往左的長度。
往右看第一個區間也是從左往右的長度,第二個區間也是從右往左的長度。
通過找規律可知奇數倍的區間是左往右的長度,偶數倍的區間是右往左的長度。
同理上下也是如此

#include<stdio.h>
int abs(int a){
    if(a<0)a=-a;
    return a;
}
int main(){
    int n,m,t;
    scanf("%d%d%d",&n,&m,&t);
    while(t--){
        int a,b,c;
        char op[4];
        scanf("%d%d%d%s",&a,&b,&c,op);
        if(op[0]=='R')a+=c;
        else if(op[0]=='L')a-=c;
        else if(op[0]=='U')b-=c;
        else b+=c;
        a=abs(a);b=abs(b);
        int t1=a/n,t2=b/m;
        if(t1%2==0)printf("%d ",a%n);
        else printf("%d ",n-a%n);
        if(t2%2==0)printf("%d\n",b%m);
        else printf("%d\n",m-b%m);
    }
    return 0;
}

1005 maomeng的答題卡

由題意可得二維碼的大小為n,有m個塗過的點
對於一個全部都是數字的字串,將它分為兩個數字,例如0404(4,4)、404(4,4);
而對於其中有特殊字元的字串,以特殊字元為分隔線分為兩個數字,例如04/04(4,4)、4/4(4,4)、04/4(4,4)、4/04(4,4);
然後對這個座標進行塗點(注意行列是相反的,例如字串得出的座標是(4,5),實際上圖的點是(5,4))
因為有前導0的情況,所以我們從後往前列舉兩個數字

#include<stdio.h>
#include<string.h>
int g[110][110];
char s[110];
int n,m,len,i,j;
int sum,a,b,flag;//flag判斷是否取出了一個數
// a代表第一個數,b代表第二個數。
int main(){
    scanf("%d%d",&n,&m);
    while(m--){
        sum=flag=0;j=1;
        scanf("%s",s);len=strlen(s);
        for(i=len-1;i>=0;i--){
            if(s[i]==';'||s[i]=='/'){//以特殊符號為分隔符
                if(flag==0){
                    j=1;b=sum;sum=0;flag=1;
                }
                continue;
            }
            sum=sum+j*(s[i]-'0');//取出這個數字
            j=j*10;
            if(j==100&&flag==0){//假如已經取出兩位數
                j=1;b=sum;sum=0;flag=1;
            }
        }
        a=sum;
        g[b][a]=1;//塗點
    }
    for(i=n;i>=1;i--){
        for(j=1;j<=n;j++){
            if(g[i][j]==1)printf("#");
            else printf(".");
        }
        printf("\n");
    }
    return 0;
}