A - Dreamoon and Ranking Collection
题意:在一串数字中添加x个数,使得从1开始到某个数连续,求这个数。
思路:从1开始遍历到出现的最大值,如果没有这个数,就增添上;直到x用没;然后再依次遍历直到某个数没出现
代码:
/*
\\ //
\\ //
\\ //
##DDDDDDDDDDDDDDDDDDDDDD##
## DDDDDDDDDDDDDDDDDDDD ##
## hh /\ ***** hh ##
## hh //\\ ** hh ##
## hh //__\\ ** hh ##
## hh// \\ ***** hh ##
## hh wwww hh ##
## hh hh ##
## MMMMMMMMMMMMMMMMMMMM ##
##MMMMMMMMMMMMMMMMMMMMMM##
\/ \/
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define fora(i,a,b) for (int i = (a); i < (b); i++)
#define fors(i,a,b,s) for (int i = (a); i < (b); i=i+(s))
int main(){
int a,n,t,x;
cin>>t;
while(t--){
map<int,int>mp;
scanf("%d%d",&n,&x);
int ans=0,mmax=0;
for(int i=1;i<=n;i++){
scanf("%d",&a);
mp[a]=1;
mmax=max(mmax,a);
}
for(int i=1;i<=mmax+1000;i++){
if(mp[i]==0&&x){
x--;
mp[i]=1;
}
else if(mp[i]==0&&x==0){
ans=i;
break;
}
}
for(int i=1;i<=mmax+1000;i++){
if(mp[i]!=1){
break;
}
ans=i;
}
printf("%d\n",ans);
}
return 0;
}
C - Exercising Walk
题意:给定一个矩形,左下角顶点坐标为(x_1,y_1),右上角顶点坐标为(x_2,y_2))。现在有一个起点(x,y)(x,y),以及四个数a,b,c,d,问能否从起点开始走若干步(向左,向右,向上或向下),使向左、右、下、上分别共走了a,b,c,d步。
思路:无论怎么走,水平方向上一定向右走了(b-a)步,竖直方向上向上走了(d-c)步,即最终位置为 (x+b-a, y+d-c),只要判断这个位置在不在 x_1,y_1,x_2,y_2 的范围内就可以了.需要注意的是,即使 b-a=0(或 d-c=0),如果 x_1=x_2或y_1=y_2,依然无路可走.
代码:
/*
\\ //
\\ //
\\ //
##DDDDDDDDDDDDDDDDDDDDDD##
## DDDDDDDDDDDDDDDDDDDD ##
## hh /\ ***** hh ##
## hh //\\ ** hh ##
## hh //__\\ ** hh ##
## hh// \\ ***** hh ##
## hh wwww hh ##
## hh hh ##
## MMMMMMMMMMMMMMMMMMMM ##
##MMMMMMMMMMMMMMMMMMMMMM##
\/ \/
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define fora(i,a,b) for (int i = (a); i < (b); i++)
#define fors(i,a,b,s) for (int i = (a); i < (b); i=i+(s))
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int x,y,x1,y1,x2,y2;
scanf("%d%d%d%d%d%d",&x,&y,&x1,&y1,&x2,&y2);
int right=x+b-a,up=y+d-c;
if(right<x1||right>x2||up<y1||up>y2
||x1==x2&&a||y1==y2&&c){
cout<<"No"<<endl;
continue;
}
cout<<"Yes"<<endl;
}
return 0;
}
D - Composite Coloring
题意:分组,把有相同公约数的数字分成一组
思路:1000以内的质因数共有11个,遍历他们能整除同一个数的就是在一组里的。
代码:
/*
\\ //
\\ //
\\ //
##DDDDDDDDDDDDDDDDDDDDDD##
## DDDDDDDDDDDDDDDDDDDD ##
## hh /\ ***** hh ##
## hh //\\ ** hh ##
## hh //__\\ ** hh ##
## hh// \\ ***** hh ##
## hh wwww hh ##
## hh hh ##
## MMMMMMMMMMMMMMMMMMMM ##
##MMMMMMMMMMMMMMMMMMMMMM##
\/ \/
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define fora(i,a,b) for (int i = (a); i < (b); i++)
#define fors(i,a,b,s) for (int i = (a); i < (b); i=i+(s))
const int c[15]={1,2,3,5,7,11,13,17,19,23,29,31,33};
int id[15],a[1005],b[1005],cnt,t,n;
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=11;++i)
id[i]=0;
cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i){
for(int j=1;j<=11;++j){
if(a[i]%c[j]==0){
if(id[j]==0)
id[j]=++cnt;
b[i]=id[j];
break;
}
}
}
printf("%d\n",cnt);
for(int i=1;i<=n;++i)
printf("%d ",b[i]);
puts("");
}
return 0;
}
E - K-th Beautiful String
题意:给出数字n,构造一串含有两个b的字符串,并按照字典顺序标号,输出要求的编号的字符串
思路:找规律,发现第一个b动的时候情况就是等差数列的和种情况,然后按照给定的数字求出相应的第一个b的位置,然后判断距离要求的还有几种情况,在确定第二个b的位置。
代码:
/*
\\ //
\\ //
\\ //
##DDDDDDDDDDDDDDDDDDDDDD##
## DDDDDDDDDDDDDDDDDDDD ##
## hh /\ ***** hh ##
## hh //\\ ** hh ##
## hh //__\\ ** hh ##
## hh// \\ ***** hh ##
## hh wwww hh ##
## hh hh ##
## MMMMMMMMMMMMMMMMMMMM ##
##MMMMMMMMMMMMMMMMMMMMMM##
\/ \/
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define fora(i,a,b) for (int i = (a); i < (b); i++)
#define fors(i,a,b,s) for (int i = (a); i < (b); i=i+(s))
int main(){
int n,m,t;
cin>>t;
while(t--){
cin>>n>>m;
char ss[n+1];
memset(ss,'a',sizeof(ss));
int ans=0,i;
for(i=1;i<=n+5;i++){
ans+=i;
if(ans>=m)
break;
}
ss[i]='b';
int index=ans-m;
ss[i-index-1]='b';
for(int i=n-1;i>=0;--i)
cout<<ss[i];
cout<<endl;
}
return 0;
}
F - Carousel
题意:已知有n个点的环,点i的类型为a_i,现在需要给每个点进行染色,要求相邻不同类型的点的颜色不同且所用颜色数最小.输出颜色数及一种染色方案即可.(颜色从1开始)
思路:分情况讨论:你只要从第一个开始交替染 1 和 2,然后假如 n 为奇数把最后一个换成染 3,那么,很显然任意相邻两个颜色不同,自然也符合了条件。考虑何时答案为 1:所有 t_i相等,全染 1 即可。考虑何时答案为 2:n 为偶数,交替染 1 和 2 即可;或者,有至少两个相邻的数相等,那么从中间断开为链后交替染 1 和 2 即可。考虑何时答案为 3:n 为奇数且相邻的每一对数都不相等。此时,交替染 1 和 2 然后把最后一个改成 3 即可。
代码:
/*
\\ //
\\ //
\\ //
##DDDDDDDDDDDDDDDDDDDDDD##
## DDDDDDDDDDDDDDDDDDDD ##
## hh /\ ***** hh ##
## hh //\\ ** hh ##
## hh //__\\ ** hh ##
## hh// \\ ***** hh ##
## hh wwww hh ##
## hh hh ##
## MMMMMMMMMMMMMMMMMMMM ##
##MMMMMMMMMMMMMMMMMMMMMM##
\/ \/
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define fora(i,a,b) for (int i = (a); i < (b); i++)
#define fors(i,a,b,s) for (int i = (a); i < (b); i=i+(s))
int a[200005];
int main()
{
int t,x,fi;
scanf("%d",&t);
while(t--)
{
int n;
bool flag=0,flag1=1;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<=n;++i){
int p=i-1;
if(p==0)
p=n;
if(a[i]==a[p])
flag=1;
else
flag1=0;
}
if(flag1){
printf("1\n");
for(int i=1;i<=n;++i)
printf("1 ");
printf("\n");
}
else if(n%2==0){
printf("2\n");
for(int i=1;i<=n/2;++i)
printf("%d %d ",2,1);
printf("\n");
}
else if(flag){
printf("2\n");
flag=0;
for(int i=1;i<=n;++i){
int p=i-1;
if(p==0)
p=n;
if(flag)
printf("%d ",2-(i%2));
else if(a[i]==a[p])
printf("%d ",2-(i%2)),flag=1;
else
printf("%d ",i%2+1);
}
printf("\n");
}
else {
printf("3\n");
for(int i=1;i<n;++i){
printf("%d ",i%2+1);
}
printf("%d\n",3);
}
}
return 0;
}