• AGC001 D


    把回文串的相等关系连一下,发现最后要求的是一笔画问题
    注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值
    如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m-1]放上去,这样就是错位着一笔画了,然后剩下一个奇数值连成若干2中间一个1的样子;
    如果一个奇数,那么把奇数放到最后,然后前面像上面一样错位相连,最后剩一个偶数,全连2即可
    如果两个奇数,那么把奇数放到两端,然后b[1]=a[1]+1,这样就相当于一个奇数,错位相连再填2即可

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    int n,m,a[N],b[N],tot,w[N],top;
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=m;i++)
    	{
    		a[i]=read();
    		if(a[i]&1)
    			w[++top]=i;
    	}
    	if(top>2)
    	{
    		puts("Impossible");
    		return 0;
    	}
    	if(top==0)
    	{
    		b[++tot]=1;
    		for(int i=1;i<m;i++)
    			b[++tot]=a[i];
    		for(int i=1;i<=(a[m]-1)/2/2;i++)
    			b[++tot]=2;
    		b[++tot]=1;
    		for(int i=(a[m]-1)/2/2+1;i<=(a[m]-1)/2;i++)
    			b[++tot]=2;
    	}
    	if(top==1)
    	{
    		swap(a[w[1]],a[m]);
    		b[++tot]=1;
    		for(int i=1;i<m;i++)
    			b[++tot]=a[i];
    		for(int i=1;i<=(a[m]-1)/2;i++)
    			b[++tot]=2;
    	}
    	if(top==2)
    	{
    		swap(a[w[1]],a[m]);
    		swap(a[w[2]],a[1]);
    		b[++tot]=a[1]+1;
    		for(int i=2;i<m;i++)
    			b[++tot]=a[i];
    		for(int i=1;i<=(a[m]-1)/2;i++)
    			b[++tot]=2;
    	}
    	for(int i=1;i<=m;i++)
    		printf("%d ",a[i]);
    	printf("
    %d
    ",tot);
    	for(int i=1;i<=tot;i++)
    		printf("%d ",b[i]);
    	return 0;
    }
    
  • 相关阅读:
    正则表达式常用收集
    IIS 部署nodejs
    借助svn进行半自动多台服务器上线部署
    快速开发window服务器程序
    sql server 存储过程解密
    EF 剥坑
    测试常规需要测试的东西
    html5本次存储几种方式
    log4net 写日志配置
    js 获取定位信息
  • 原文地址:https://www.cnblogs.com/lokiii/p/10920753.html
Copyright © 2020-2023  润新知