思路
无解。 时 权值为 , 权值为 , 权值为 。 时如样例。
证明 不合法。归纳,对于 的 使得 不合法,如果全同色, 可以加在最前或最后;否则找到分界点 , 以前为 ,以后为 ,如果 为 , 不合法,否则 不合法。
对于 时 合法。将 分为 个集合 ,对应 时的 。集合内权值为 ,集合间权值为 的权值。可能不合法的方案会要求连续在 和 间切换,再连续在 和 间切换,即 。其他一些可能不合法的情况也要求其中一个集合至少为另外两个集合之和。令 。但当 时会寄,特判即可。
code
int n,e[21][21];
void work(){
n=read();
if(n<=3){puts("No");return ;}
puts("Yes");
if(n==5){
cout<<"2 1 4 4\n4 3 1\n1 3\n2\n";
return ;
}
int x1=n/4,x2=n/4,x3=n/4,x4=n/4;
if(n%4)x1++;
if(n%4>1)x2++;
if(n%4>2)x3++;
for(int i=1;i<=x1;i++){
for(int j=1;j<=x1;j++)e[i][j]=3;
for(int j=x1+1;j<=x1+x2;j++)e[i][j]=1;
for(int j=x1+x2+1;j<=x1+x2+x3;j++)e[i][j]=3;
for(int j=x1+x2+x3+1;j<=n;j++)e[i][j]=2;
}
for(int i=x1+1;i<=x1+x2;i++){
for(int j=x1+1;j<=x1+x2;j++)e[i][j]=3;
for(int j=x1+x2+1;j<=x1+x2+x3;j++)e[i][j]=2;
for(int j=x1+x2+x3+1;j<=n;j++)e[i][j]=3;
}
for(int i=x1+x2+1;i<=x1+x2+x3;i++){
for(int j=x1+x2+1;j<=x1+x2+x3;j++)e[i][j]=3;
for(int j=x1+x2+x3+1;j<=n;j++)e[i][j]=1;
}
for(int i=x1+x2+x3+1;i<=n;i++){
for(int j=x1+x2+x3+1;j<=n;j++)e[i][j]=3;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++)cout<<e[i][j]<<" ";cout<<"\n";
}
}