2021 JSCPC C,D

C-Magical Rearrangement

Gym 103495C

题目大意

t组样例,每组给你一个长度为10的数列,ai代表i有几个,问能否能够构造出一个最小的数使得没有前导零且相邻的两个数为不相等,若能则输出这个数,不然则输出1(1t104,0ai105,1n=i=09ai105)

思路

很容易能想到什么时候可以直接输出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

Gym - 103495D

题目大意

一个n×m的手机锁屏界面,问到达所有点且一条线不能经过多于两点的方案。(2n,m500)

思路

我们可以先想到只有两行或两列的方案,然后有偶数的情况就结束了,然后是全是奇数的情况,我们可以最后做到只有3×3,然后就结束了。

代码

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

__EOF__

本文作者Jerry-Black
本文链接https://www.cnblogs.com/Jerry-Black/p/16062061.html
关于博主:小蒟蒻一只( ̄^ ̄)ゞ
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
posted @   Jerry_Black  阅读(217)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示