A.Three Blocks Palindrome (easy version)
#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
//官方题解 printf("%d\n",(n-1)/2);
if(n<3){
printf("%d\n",0);
continue;
}
int res=0;
if(n&1) res=n/2;
else res=n/2-1;
printf("%d\n",res);
}
return 0;
}
B. Construct the String
思路:构造一个长度为a的字符串,其中不同字符个数为b个,将其重复便可得到所需字符串。
#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,a,b;
scanf("%d %d %d",&n,&a,&b);
char s[2010];
int cnt=0;
for(int i=0;i<a-b+1;i++) s[cnt++]='a';
char ss='a';
for(int i=a-b+1,j=1;i<a;i++){
s[cnt++]=(ss+j);
j++;
}
for(int i=a;i<n;i++) s[cnt++]=s[i-a];
for(int i=0;i<cnt;i++) putchar(s[i]);
printf("\n");
}
return 0;
}
C. Two Teams Composing
思路:得到字符串中不同字符的个数与单个出现最多的次数,结果便是二者小的哪一个,特殊情况是相同元素那一组多一个的话可以匀给另一组一个。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int x;
int cnt1[n+1];
memset(cnt1,0,sizeof(cnt1));
for(int i=0;i<n;i++){
scanf("%d",&x);
cnt1[x]++;
}
int maxnum=0,cnt=0;
for(int i=0;i<=n;i++){
if(cnt1[i]!=0) cnt++;
if(cnt1[i]>maxnum) maxnum=cnt1[i];
}
if(maxnum>cnt) printf("%d\n",cnt);
else if(cnt==maxnum) printf("%d\n",cnt-1);
else printf("%d\n",maxnum);
}
return 0;
}
D. Anti-Sudoku
思路:整体遍历,把所有的2替换为1,便可以达到要求。
#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char s[9][9];
for(int i=0;i<9;i++) scanf("%s",s[i]);
for(int i=0;i<9;i++){//puts多香,我写代码时候没脑子
for(int j=0;j<9;j++){
if(s[i][j]=='2')
s[i][j]='1';
putchar(s[i][j]);
}
putchar('\n');
}
}
}
E1. Three Blocks Palindrome (easy version)
思路:
E2. Three Blocks Palindrome (hard version)
思路: