《算法艺术与信息学竞赛》之 贪心 例三 Mirror

来源:互联网 发布:电商商品排序算法 编辑:程序博客网 时间:2024/05/16 17:48

Description

数学家Andris有一个小盒子,其底部是N*M(N<=m1<=n,m<=100,)的格子,每个格子可以放一面45度朝向的镜子。 在盒子的边界,每行每列的两端,有一些孔,光线可以从中射入盒子,也可以射出。如图所示,从孔2射进盒子的光线经过 两次反射后又从孔7射出。Andris想请你设计一个盒子,使得从每个孔射入的光线都会从指定的孔射出. 例如如果它希望从10个孔射入的光线分别由孔9,7,10,8,6,5,2,4,1,3射出,则下图是一个满足要求的盒子.
这里写图片描述
Input
Output
Sample Input
2 3
9
7
10
8
6
5
2
4
1
3
Sample Output
0 1 0
0 1 1
本题目前只在大视野上找到了题目,但是没有solve的,原因很简单,本题是可以有多解的,但是在大视野上加题目的这个人应该是没有意识到这一点的。所以没有人Ac
那么这个题是怎么做的呢?我们不妨来分析一下。
对于每一个要从指定出口射出的光线,一定有一条从这个出口出去的其他光线,那么基于贪心的原则,我们可以先将这条光线转移到目标位置,这样必然会造成以前射入该点的光线改变终点,那么对于这一改变过的光线,再次重复这个操作,直到不能重复为止,接下来继续循环到下一个没有被处理过的点即可。
中途的一些描述可能看起来十分复杂,我们来分析一下样例。
一共有2*(2+3)共十个出口,我们做一个1~10的循环,维护to[i]数组表示第i个口当前到达的出口。
首先扫到1
发现1光线直接到了7出口,而1光线是要到9出口的,所以我们进行如下操作:找到9出口对应的4出口,两条光线相交的地方放一面镜子,然后现在更新to的值,to[1]=9,to[9]=1,to[4]=7,to[7]=4;
目前的状态如下
0 1 0
0 0 0
1口已经处理完毕,接下来看4口,to[4]=7,而4需要到8去,8又对5,所以再次进行同样的操作,那么现在更新后的的数组值分别为to[4]=8,to[8]=4,to[5]=7,to[7]=5。目前的状态如下:
0 1 1
0 0 0
然后到了5,to[5]=7,而5要到6,6又对着2,在此同理,我们将第三块镜子放下,更新to的值后状态如下。
0 1 1
0 0 1
继续操作,发现这次更改的2号已经可以到其目标7号了,所以我们跳过这次操作,继续最开始的循环。
发现目标正确的就可以直接跳过了,我们这次操作完发现,这三个镜子已经可以满足全部需求了!
大家可以看到,我所得到的解就是不同于样例的一组,所以这个题应该是需要spj的。
刚才只是一个最简单的情况,有人可能会疑问,若是需要修改的两条光线没有交点怎么办,其实,只需要先处理别的光线,车到山前必有路嘛。
这次没有地方交,大视野上数据应该是有问题,所以也没有写代码不过写的分析还是比较详细的吧,如有不足请多指正。

阅读全文
0 0
原创粉丝点击