台州学院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的图形

这题就直接找规律,直接上代码
当然直暴力枚举判断打印13种图形也是可以的

#include<stdio.h>
void xing(int x){//自定义函数打印星号
    int i;
    for(i=1;i<=x;i++){
        printf(" *");
    }
    printf("\n");
}
void kong(int x){//自定义函数打印空格
    int i;
    for(i=0;i<x;i++)printf(" ");
}
int main(){
    int n,i;
    scanf("%d",&n);
    kong(n-2);xing(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);xing(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++){//前面比第i个数小的个数
            if(w[j]<w[i])s1++;
        }
        for(j=i+1;j<=n;j++){//后面比第i个数小的个数
            if(w[j]<w[i])s2++;
        }
        res+=s1*s2;
    }
    printf("%lld",res);
    return 0;
}

1004 小球反弹

由题意可得,w代表的是左右方向的大小,h代表上下方向的大小。
以左右方向为例:
我们将坐标轴分成无限个长度为w的区间
往左看第一个区间是从左往右的长度,第二个区间是从右往左的长度。
往右看第一个区间也是从左往右的长度,第二个区间也是从右往左的长度。
通过找规律可知奇数倍的区间是左往右的长度,偶数倍的区间是右往左的长度。
同理上下也是如此
(代码中的区间标记是以0开始的,题解中的区间标记是以1开始的)

#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); //将a,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;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM