牛客周赛round78 B,C

B.一起做很甜的梦

题意:就是输出n个数(1-n),使输出的序列中任意选连续的小序列(小序列长度>=2&&<=n-1)不符合排列(例如如果所选长度为2,在所有长度为2 的小序列里不能出现同时出现1和2)

思路:读懂题意后,我举了几个例子然后我认为要把这n个数用一个数组左右存,就是左边存奇数,右边存偶数,反正1-n都要存,为了对应合适,我从数组下标为1时开始存,同时积累奇数和偶数的数量奇数的个数就是对应输出数组的下标,输出的数字就是i,偶数的下标是n-even+1;然后从1-n开始依次打印此数组。

#include <stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);//表示记忆的段数
    int arr[200005]={0};
    int odd=0,even=0;//odd为奇数,even为偶数
    for(int i=1;i<=n;i++)
    {
        if(i%2==1)
        {
            odd++;
            arr[odd]=i;
        }
        else if(i%2==0)
        {
            even++;
            arr[n-even+1]=i;
        }
    }
    for(int i=1;i<=n;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

C翻之

题意:给一个由‘0’,‘1’构成的n行m列的矩阵,可以进行的操作就是选择任一行的元素,把元素完全翻转,问最多能够使几列元素均为‘1’

思路:emmmm当时做题的时候没啥思路,找含有‘1’最多的列?->然后翻转含有0的那一行,然后形成一个新矩阵,把已经形成都是1的那一列标记一下,然后继续在新矩阵这样操作?好像不可以。所以思路就断了

看完题解后:只要是转置行一定会影响其他的列,所以我们只需要考虑相同的列有几个就行了,然后需要注意的就是他是输入字符串,要注意给\0留位置。

#include<stdio.h>
#include<string.h>
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    char a[n][m+1];//创建一个n行m+1列的矩阵,最后一列存放每行字符串的\0
    char b[m][n+1];//创建一个m行n+1列的矩阵,最后一列存放每行字符串的\0
    for(int i=0;i<n;i++){
        scanf("%s",a[i]);//读取一个字符串,存储到二维数组a的第i行,a[i]表示第i行的首地址
        a[i][m]=0;//最后一个存\0,使之能够准确读取字符串
    }
    for(int i=0;i<m;i++){
        int j=0;
        for(j=0;j<n;j++){
            b[i][j]=a[j][i];//把矩阵a中的元素逆置存储在矩阵b中
        }
        b[i][n]=0;//矩阵b的最后一列存\0
    }
    int max=0;//用于记录相同列的最大数量
    for(int i=0;i<m;i++){//遍历转置之后的每一行
        int cnt=1;
        if(b[i][0]=='2')//说明这一列已经被标记过了
            continue;
        for(int j=i+1;j<m;j++){//循环遍历当前列之后的所有列
                if(strcmp(b[i],b[j])==0)//如果当前列和第j列相同
                    cnt++,b[j][0]='2';//把第j列标记为2
        }
        if(cnt>max)
            max=cnt;
    }
    printf("%d",max);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值