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);
}