2021 JSCPC C,D
C-Magical Rearrangement
题目大意
有\(t\)组样例,每组给你一个长度为\(10\)的数列,\(a_i\)代表\(i\)有几个,问能否能够构造出一个最小的数使得没有前导零且相邻的两个数为不相等,若能则输出这个数,不然则输出\(-1\)。\((1\leq t\leq10^4,0\leq a_i\leq10^5,1\leq n=\sum_{i=0}^{9}a_i\leq10^5)\)
思路
很容易能想到什么时候可以直接输出\(-1\),就是当有一个的两倍减一大于\(n\)的时候,那么每次取出一个数然后判断一下剩下的能否成立即可。
代码
#include<bits/stdc++.h>
using namespace std;
int a[15];
int s[100005];
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
int n=0;
int pre;
for(int i=0;i<=9;i++){scanf("%d",&a[i]);n+=a[i];}
bool ck=0;
if(n==1&&a[0]==1){printf("0\n");continue;}
if(a[0]*2>n)ck=1;
for(int i=1;i<=9;i++)if(a[i])
{
if(a[i]+a[i]-1>n){ck=1;break;}
}
if(ck){printf("-1\n");continue;}
for(int i=1;i<=9;i++)if(a[i])
{
bool ckk=0;
for(int j=0;j<=9;j++)
{
if(i==j)
{
if(a[j]-1+a[j]-1>n-1){ckk=1;break;}
}
else
{
if(a[j]+a[j]-1>n-1){ckk=1;break;}
}
}
if(ckk)continue;
else
{
s[1]=i;
pre=i;
a[i]--;
n--;
break;
}
}
int cnt=1;
while(n)
{
for(int i=0;i<=9;i++)if(i!=pre&&a[i])
{
bool ckk=0;
for(int j=0;j<=9;j++)
{
if(i==j)
{
if(a[j]-1+a[j]-1>n-1){ckk=1;break;}
}
else
{
if(a[j]+a[j]-1>n-1){ckk=1;break;}
}
}
if(ckk)continue;
else
{
s[++cnt]=i;
pre=i;
a[i]--;
n--;
break;
}
}
}
for(int i=1;i<=cnt;i++)printf("%d",s[i]);
printf("\n");
}
return 0;
}
D-Pattern Lock
题目大意
一个\(n\times m\)的手机锁屏界面,问到达所有点且一条线不能经过多于两点的方案。\((2\leq n,m\leq500)\)
思路
我们可以先想到只有两行或两列的方案,然后有偶数的情况就结束了,然后是全是奇数的情况,我们可以最后做到只有\(3\times3\),然后就结束了。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if((n&1)==0)
{
for(int i=1;i<=n;i+=2)
{
printf("%d %d\n",i,1);
for(int j=2;j<=m;j++)
printf("%d %d\n%d %d\n",i,j,i+1,j-1);
printf("%d %d\n",i+1,m);
}
}
else if((m&1)==0)
{
for(int i=1;i<=m;i+=2)
{
printf("%d %d\n",1,i);
for(int j=2;j<=n;j++)
printf("%d %d\n%d %d\n",j,i,j-1,i+1);
printf("%d %d\n",n,i+1);
}
}
else
{
for(int i=1;i<=n-3;i+=2)
{
printf("%d %d\n",i,m);
for(int j=m-1;j>=1;j--)
printf("%d %d\n%d %d\n",i,j,i+1,j+1);
printf("%d %d\n",i+1,1);
}
printf("%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n",n-2,m,n-1,m-2,n,m,n-2,m-1,n,m-2);
printf("%d %d\n%d %d\n%d %d\n%d %d\n",n-1,m,n-2,m-2,n,m-1,n-1,m-1);
for(int i=m-3;i>=1;i-=2)
{
printf("%d %d\n",n,i);
for(int j=n-1;j>=n-2;j--)
printf("%d %d\n%d %d\n",j,i,j+1,i-1);
printf("%d %d\n",n-2,i-1);
}
}
return 0;
}

浙公网安备 33010602011771号