下列关于网站开发中网页额,怎么做网页插件,唯一做魅惑的网站,各类网站网站建设的目标是什么意思正题
题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 n1n1n1个柱子#xff0c;前面nnn个上面各有mmm个球#xff0c;球有nnn种颜色#xff0c;每种mmm个。
你每次可以把一个柱子最上面的球放到另一个上面#xff0c;要求在820000820000820000次内使得同种颜色…正题
题目链接:https://www.luogu.com.cn/problem/P7115 题目大意
n1n1n1个柱子前面nnn个上面各有mmm个球球有nnn种颜色每种mmm个。
你每次可以把一个柱子最上面的球放到另一个上面要求在820000820000820000次内使得同种颜色的球都在同一个柱子上。
输出方案
2≤n≤50,2≤m≤4002\leq n\leq 50,2\leq m\leq 4002≤n≤50,2≤m≤400 解题思路
这题好难啊用的是洛谷题解上的做法。
首先我们枚举一种颜色xxx将这种颜色标记为111其他都为000。
然后开始的状态是这样的 然后考虑先构造一个全部都是000的竖列
我们先记录第一柱的111的个数tmptmptmp然后把第n−1n-1n−1柱子的tmptmptmp个丢进第n1n1n1柱然后把第一柱分离到后面两个柱子111的放到nnn000的放到n1n1n1 然后把原来的000放到第一柱然后分离第二柱如果是000放到第一柱否则放到第n1n1n1柱如果第一柱已经满了就放进n1n1n1柱 然后交换一下柱子序号用个数组存一下就好了就变成了 然后再考虑构造全111柱
我们把同理把第111柱分裂到第nnn和第n1n1n1柱就变成了 此时第n1n1n1柱子上面全部是111而第nnn柱上面都是000然后此时我们再把剩下nnn个柱子依次分离就能把所有的111提到最上面然后把所有的111集合就好了。
最后弄出n−1n-1n−1个全000柱和一个全111柱我们就可以把全一柱去掉然后缩小nnn的值。
一直重复到n2n2n2时我们发现我们的方法不再适用需要特别处理。
我们按照前面的方法把第一柱分离到222和333 然后把000和111丢到第一个柱子然后再把111丢进第333个柱子 然后分离第二个柱子就好了
然后这样就能过了 code
#includecstdio
#includecstring
#includealgorithm
#includevector
using namespace std;
const int N410;
int n,m,a[N][N],cnt[N],p[N];
vectorint aL,aR;
void mov(int x,int y){aL.push_back(x);aR.push_back(y);a[y][cnt[y]]a[x][cnt[x]--];return;
}
int count(int x,int y){int ans0;for(int i1;im;i)ans(a[x][i]y);return ans;
}
int main()
{scanf(%d%d,n,m);for(int i1;in;i){for(int j1;jm;j)scanf(%d,a[i][j]);cnt[i]m;p[i]i;}p[n1]n1;for(int kn;k3;k--){int tmpcount(p[1],k);for(int i1;itmp;i)mov(p[k],p[k1]);for(int i1;im;i)if(a[p[1]][cnt[p[1]]]k)mov(p[1],p[k]);else mov(p[1],p[k1]);for(int i1;im-tmp;i)mov(p[k1],p[1]);for(int i1;im;i)if(a[p[2]][cnt[p[2]]]k)mov(p[2],p[k1]);else if(cnt[p[1]]m)mov(p[2],p[1]);else mov(p[2],p[k1]);swap(p[1],p[k]);swap(p[2],p[k1]);for(int i1;ik;i){int tmpcount(p[i],k);for(int j1;jtmp;j)mov(p[k],p[k1]);for(int j1;jm;j)if(a[p[i]][cnt[p[i]]]k)mov(p[i],p[k]);else mov(p[i],p[k1]);swap(p[i],p[k1]);swap(p[k],p[i]);}for(int i1;ik;i){while(a[p[i]][cnt[p[i]]]k)mov(p[i],p[k1]);while(cnt[p[i]]m)mov(p[k],p[i]);}}int tmpcount(p[1],1);for(int i1;itmp;i)mov(p[2],p[3]);for(int i1;im;i)if(a[1][cnt[p[1]]]1)mov(p[1],p[2]);else mov(p[1],p[3]);for(int i1;im-tmp;i)mov(p[3],p[1]);for(int i1;itmp;i)mov(p[2],p[1]);while(cnt[p[3]])mov(p[3],p[2]);for(int i1;itmp;i)mov(p[1],p[3]);for(int i1;im;i)if(a[2][cnt[p[2]]]1)mov(p[2],p[3]);else mov(p[2],p[1]);printf(%d\n,aL.size());for(int i0;iaL.size();i)printf(%d %d\n,aL[i],aR[i]);return 0;
}