Description

给定 \(n+1\) 个栈,前 \(n\) 个栈内有不定的 \(m\) 个元素,最后一个栈为空,每个栈的最大容量为 \(m\)

每种颜色都有 \(m\) 种,求任意一种方法,使得在 \(820000\) 次操作内把相同的元素都移动到同一个栈内

Solution

考虑移动单个元素

枚举元素种类,设当前枚举到的元素种类为 \(Now\)

移动规则如下

  • 统计第一个柱子上元素 \(Now\) 的数量 \(Count\)

  • 从第 \(Now\) 个栈移动 \(Count\) 个元素到第 \(Now+1\) 个栈上(为了预留出位置存放元素 \(Now\))

  • 把第一根柱子的元素分离,是 \(Now\) 的放到栈 \(Now\) 内,不是的放到栈 \(Now+1\) 内

  • 从栈 \(Now+1\) 移动 \(m-Count\) 个元素到第一个柱子(为第二个柱子让位)

  • 把第二个栈内不是 \(Now\) 的元素移动到第一个栈上,放不开了就放到第 \(Now+1\) 个栈内

  • \(\text{swap}\) 分别交换第一和第 \(Now\),第二和第 \(Now+1\) 个栈(这样不停操作第一二个栈和枚举的栈 \(Now\) 就可以了)

  • 然后 \(k\) 枚举第一到第 \(Now\) 个栈,分别统计他们里面元素 \(Now\) 的数量,然后把第 \(Now\) 个栈移走相同数量的元素到 \(Now+1\) 上(原因同第二步)

  • 分离当前枚举到的栈内的元素,把元素 \(Now\) 都放到栈 \(Now\) 内,其他的都放到栈 \(Now+1\) 内

  • \(\text{swap}\) 分别交换第 \(k\) 和第 \(Now\),第 \(k\) 和第 \(Now+1\) 个栈(证明栈 \(Now\) 已被处理完,之后不会再对其操作)

  • 然后把第一到第 \(Now\) 个栈上方的 \(Now\) 元素都移到栈 \(Now+1\) 上,放上栈 \(Now\) 内的元素 \(Now\)(此时栈 \(Now\) 上方全是元素 \(Now\))

如此,可以处理完所有的颜色

然而,这个方法并不适用于 \(n=2\) 的情况

原因是当枚举第一个颜色时,第 \(Now+1\) 个栈就是第二个栈

所以要特判处理

移动规则与 \(n\geq3\) 时大同小异

无非是

  • 统计第一栈内元素 \(1\) 的个数,然后从第二栈移动相同的数量到第三栈

  • 分离第一栈,把元素 \(1\) 放到第二栈上,其他的放到第三栈上

  • 然后把第二栈上的元素 \(1\) 移回第一栈,使第一栈此时只有元素 \(1\)

  • 从第三栈移动 \(m-Count\) 个元素到第一栈,剩下的移回第二栈

  • 把那 \(m-Count\) 个元素移回去

  • 分离第二栈,是 \(1\) 的放回第一栈,不是的放回第三栈

因为一种只有两种元素,且可以确定第一栈全为 \(1\) ,第三栈全为 \(2\)

所以至此问题得到解决

极限操作次数为 \(\sum_{i=1}^n im + 5m\),大概需要 \(600000\) 次,时间复杂度同操作次数

Code

#include<bits/stdc++.h>
#define rr register
#define maxn 410
#define maxm 850010 using namespace std; int n,m,cnt[maxn],fr[maxm],to[maxm];
int Col[maxn][maxn],P[maxn];
int Ans;
//Col[i][j]第 i 根柱子上的第 j 个球的颜色
//P[i]第 i 跟柱子
//cnt[i]当前柱子上球的数量 inline int Read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
} inline int Get_Count(int x,int y){
int ans=0;
for(int i=1;i<=m;i++) if(Col[x][i]==y) ans++;
return ans;
} inline void Move_Ball(int x,int y){
fr[++Ans]=x;to[Ans]=y;
Col[y][++cnt[y]]=Col[x][cnt[x]--];
} inline int Top(int x){return Col[x][cnt[x]];} int main(){
n=Read();m=Read();
for(rr int i=1;i<=n;i++){cnt[i]=m;for(rr int j=1;j<=m;j++) Col[i][j]=Read();}
for(rr int i=1;i<=n+1;i++) P[i]=i;cnt[n+1]=0;
for(rr int Now=n;Now>=3;Now--){
int Count=Get_Count(P[1],Now);
for(rr int i=1;i<=Count;i++) Move_Ball(P[Now],P[Now+1]);
for(rr int i=1;i<=m;i++) if(Top(P[1])==Now) Move_Ball(P[1],P[Now]);else Move_Ball(P[1],P[Now+1]);
for(rr int i=1;i<=m-Count;i++) Move_Ball(P[Now+1],P[1]);
for(rr int i=1;i<=m;i++) if(Top(P[2])==Now||cnt[P[1]]==m) Move_Ball(P[2],P[Now+1]);else Move_Ball(P[2],P[1]);
swap(P[1],P[Now]);swap(P[2],P[Now+1]);
for(rr int k=1;k<Now;k++){
Count=Get_Count(P[k],Now);
for(rr int i=1;i<=Count;i++) Move_Ball(P[Now],P[Now+1]);
for(rr int i=1;i<=m;i++) if(Top(P[k])==Now) Move_Ball(P[k],P[Now]);else Move_Ball(P[k],P[Now+1]);
swap(P[k],P[Now+1]);swap(P[k],P[Now]);
}
for(rr int i=1;i<Now;i++) while(Top(P[i])==Now) Move_Ball(P[i],P[Now+1]);
for(rr int i=1;i<Now;i++) while(cnt[P[i]]<m) Move_Ball(P[Now],P[i]);
}
int Count=Get_Count(P[1],1);
for (rr int i=1;i<=Count;i++) Move_Ball(P[2],P[3]);
for (rr int i=1;i<=m;i++) if (Top(P[1])==1) Move_Ball(P[1],P[2]);else Move_Ball(P[1],P[3]);
for (rr int i=1;i<=Count;i++) Move_Ball(P[2],P[1]);
for (rr int i=1;i<=m-Count;i++) Move_Ball(P[3],P[1]);
while (cnt[P[3]]) Move_Ball(P[3],P[2]);
for (rr int i=1;i<=m-Count;i++) Move_Ball(P[1],P[3]);
for (rr int i=1;i<=m;i++) if (Top(P[2])==1) Move_Ball(P[2],P[1]);else Move_Ball(P[2],P[3]);
printf("%d\n",Ans);for(int i=1;i<=Ans;i++) printf("%d %d\n",fr[i],to[i]);
return 0;
}

NOIP2020 移球游戏的更多相关文章

  1. P7115-[NOIP2020]移球游戏【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 \(n+1\)个柱子,前面\(n\)个上面各有\(m\)个球,球有\(n\)种颜色,每种\(m\ ...

  2. nyist 518 取球游戏

    http://acm.nyist.net/JudgeOnline/problem.php?pid=518 取球游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 今 ...

  3. 躲避球游戏ios源码

    躲避球游戏源码,有限源码是一个基于cocos2d的躲避球游戏源码的,并且还引用了大家熟悉google广告的,进行推广,已经还有带game center等,游戏操作很简单,用手指按住物体,然后移动物体避 ...

  4. 取球游戏|2012年蓝桥杯B组题解析第十题-fishers

    (25')取球游戏 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出 ...

  5. 取球游戏_nyoj_518(博弈-蓝桥杯原题).java

    取球游戏 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2   描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下 ...

  6. nyoj_518_取球游戏_201404161738

    取球游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个 ...

  7. 放球游戏B

    题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球, ...

  8. 【题解】放球游戏B

    题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球, ...

  9. 【题解】放球游戏A

    题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.每个人一次只能放1至5个球,最后面对没有空格而不能放球的人为输. ...

随机推荐

  1. 在vue 中 element-ui table结合Popover使用

    在vue 中 element-ui table结合Popover使用 <el-table-column label="操作" > <template slot-s ...

  2. AWS中国区的那些“坑”

    前言 最近做的一个项目是要把公司在国外已经上线的一个物联网的项目移植到AWS中国区来. 由于AWS属于国外云产商,在中国运营,必须符合国家的相关规定: 必须是合资公司 (AWS北京区由北京光环新网运营 ...

  3. HTTP ERROR400的问题解决

    今天写添加功能,在点添加提交时报了一个"HTTP ERROR 400"的错误,如图, 请求提交的代码死活跳转不到后台,郁闷中,开启debug功能,开始一步步排查, 1.先单独把跳转 ...

  4. 智能BPOS小票模板字体的使用

    关于伯俊智能BPOS零售小票模板的设置,常用字体"黑体"."宋体"."Arial"这几个字体,在设置的时候看似没有问题, 但是在正真使用打印 ...

  5. SQL Server解惑——为什么ORDER BY改变了变量的字符串拼接结果

      在SQL Server中可能有这样的拼接字符串需求,需要将查询出来的一列拼接成字符串,如下案例所示,我们需要将AddressID <=10的AddressLine1拼接起来,分隔符为|.如下 ...

  6. express安装问题

    步骤1 npm install -g express(全局安装express) (安装node就不必说了) 步骤2 npm install -g express-generator(安装命令工具) 完 ...

  7. 关于echarts中的noDataLoadingOption——loading动画的问题

    在最近的一个项目中用到echarts这个插件,其中关于noDataLoadingOption配置项的问题让我困惑了好长时间.经过蛋疼的查找下,终于搞明白是版本的原因. 且看官网的介绍:ECharts, ...

  8. R语言学习笔记-Corrplot相关性分析

    示例图像 首先安装需要的包 install.packages("Corrplot") #安装Corrplot install.packages("RColorBrewer ...

  9. Mac M1原生(ARM64)Golang dev&debug

    前言 通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题. Go 1.16版将正式支持Apple Silicon M1芯片,即arm64架构 ...

  10. Linux SSH , SCP 建立信任关系(免密传输)

    最近有个需求,Jenkins需要将war传输到各个项目节点中,所以需要远程执行各个节点的shell脚本.但是中间有个输入密码的过程,在自动化部署中是行不通的,故需要增加免密登录.具体如下: 如果想在  ...