删除最少数量的刀片

时间:2012-01-14 01:46:01

标签: algorithm optimization language-agnostic puzzle

最近,我在Timus online judge上遇到了这个问题。对于不愿点击链接的人。问题如下:

  

乌拉尔锦标赛的经验丰富的参赛者来到   叶卡捷琳堡提前习惯了恶劣的天气   条件,走遍城市,当然,参观“林波波”   水上乐园。没有多少人知道附近有404号工厂   水上乐园,这种植物被当地人称为“错误404”。该   植物确实不容易找到,而且仍然比较困难   了解那里发生的事情。幸运的是,人们可以观看植物   从附近的人行天桥。因为看似静止而且   植物的荒凉,人们可能认为它已经停止运作,   但事实并非如此。该工厂的主要工作区域是修复   航空发动机。不久前,该工厂收到了修理订单   破碎的燃气涡轮发动机。原来,有些刀片被撕裂了   关闭,导致发动机轴上的负载过大。专家在   该工厂已决定可以快速修复发动机   去掉一些完整的刀片,使其中心的质量   剩余的刀片将再次位于旋转轴上。保持   尽可能大的发动机功率,最小数量的叶片应该   被删除。必须留下至少一个叶片,否则必须留下发动机   根本不会工作。专家断言,当所有的刀片   他们的端点完好无损,形成了正常的n-gon。告诉他们哪个   刀片应该被移除。

> Input The first line contains the initial number of blades in the
> turbine n and the number of torn blades k (3 ≤ n ≤ 20000; 1 ≤ k ≤ n −
> 1). The integer n has at most two distinct prime divisors. The next
> line contains k integers, which are the numbers of the torn blades in
> ascending order. The blades are numbered from 1 to n clockwise. 
Output
> In the first line output the minimum number of blades that should be
> removed. In the second line output the numbers of these blades in any
> order separated with a space. If several answers are possible, output
> any of them. If it is impossible to repair the engine by removing some
> of the blades, output “−1”. 
> 

我在设置此问题时遇到问题。我最初的想法是,由于需要恢复质心,因此需要将破碎的刀片包围在相同数量的未破碎刀片中。

因此,如果我们将损坏的刀片表示为0且将完整的刀片表示为1,则特定配置可表示为: 011

我不确定自己是否走在正确的轨道上并且在尝试理解这个问题时会有一些反馈意见。

谢谢

3 个答案:

答案 0 :(得分:4)

刀片的尖端最初形成一个正常的n - gon。将它们视为复数。在不失一般性的情况下,半径为1,轴在原点上,数字n的刀片尖端为1。

刀片的尖端是n - 统一的根,刀尖k位于

z_k = e^(2\pi i * k/n)

当且仅当

时,移除刀片k1, ... , kr后的质心位于旋转轴上
z_k1 + z_k2 + ... + z_kr = 0

现在让1 < d < n成为n的除数。刀片k1 + m*d, 0 <= m < n/d形成常规n/d - gon的顶点。因此,将它们全部移除会使旋转轴上的质心停止。

策略是尝试通过一组不相交的常规d_i - gons来覆盖破碎刀片的索引列表,其中d_in的除数。因此,在列表中,查找索引相等于n的除数的对。

答案 1 :(得分:3)

  

我最初的想法是,由于需要恢复质心,因此需要将破碎的刀片包围在相同数量的非破碎刀片中。

没有。螺旋桨必须是旋转对称的。如果一个叶片从3叶片螺旋桨上脱落,则无法重新定位。

关键点是:

  1. 专家断言,当所有刀片完好无损时,它们的端点形成了一个正常的n-gon。
  2. 整数n最多有两个不同的素数除数。
  3. 从适合这两个属性的简单开始,例如十边形。问问自己:多边形和对称性如何相关?那么10的除数如何与多边形和对称性相关?为了简化问题,您可以使用标量而不是二维点来表示这些多边形吗?提示:模块化算法可以解决问题。

    刀片配置图片(未固定和固定)应该有所帮助。例如:

            2                     2                     2                   2           
        3       1                     1                                                 
      4           0         4           0         4           0       4           0     
    
      5           9         5                                 9       5           9     
        6       8             6       8             6       8                   8       
            7                     7                     7                   7           
       whole 10-gon        2 broken blades       3 broken blades     3 broken blades
    

    2个破碎刀片和前3个破碎刀片有两种可能的解决方案,但每种刀片只有一种最佳。第二个3破解有一个解决方案。寻找多边形。

答案 2 :(得分:2)

这个问题在数学上确实非常复杂,但可以通过很好地理解平衡如何工作来简化。

  • 如果刀片“n”的数量是素数,除了移除每个刀片之外没有解决方案。当n是素数时,即使是一个缺失的刀片,也无法重新平衡。如果一个刀片没有解决方案,则不会有多个丢失的解决方案。
  • 根据定义(并且根据此问题的规则),刀片“n”的数量不是素数,它是两个素数“p1”和“p2”的产生,例如:对于21个刀片,p1 = 3,p2 = 7.

如果缺少一个刀片“k1”,则总计将获得平衡    “N / p2(例如= 3)刀片等间距已被删除    (可视化梅赛德斯奔驰标志)。 如果两个刀片“k1”和“k2”是    缺失,平衡将通过完全为“k2”作为    在前一种情况下,如果k1和k2在“p1”之后间隔,则除外    “p2”对称

12和20刀片的示例使得难以理解,因为它们是4的倍数,这意味着2阶的两个对称性。 我更喜欢21个刀片的例子,没有这个问题。

  1. 21刀片,一个缺失刀片k1 = 1 - >通过去除刀片8和15(对称性p1为3级)来获得平衡
  2. 21个刀片,两个缺失刀片k1 = 1,k2 = 2 - >通过去除刀片8和15获得k1和8和16获得k2
  3. 来获得平衡
  4. 21个刀片,两个缺失刀片k1 = 1,k2 = 8 - >由于k2-k1 = 7,您只需要移除刀片15即可完成平衡
  5. 21刀片,两个缺失的刀片k1 = 1,k2 = 7->,因为k2-k1 = 6 = 2 * 3,你可以注意到刀片处于7阶对称性,因此你可以完成模式通过移除刀片4,10,13,16,19以获得完美的平衡。但有趣的是,您也可以将其视为示例#2,并使用2阶对称性的两倍;因此,通过移除刀片8和15以平衡k1和14和21来平衡k2也有解决方案。
  6. 因此,要解决您的问题,您的算法应该执行以下操作:   - 如果n是素数,只需输出“-1” - 无解   - 从第一个缺失的刀片开始,扫描间隔为“n / p1(= 7)”和“n / p2(= 3)”的缺失刀片组。计算每个对称组的组数,以及需要更换的刀片数。

    • 在示例中,您的第一个订单解决方案很简单:
      要移除的叶片的数量将是(对称组的数量p1)* 7 +(对称组的数量p2)* 3 - 缺失的叶片的数量。 你必须处理例如示例4中所示的异常,其中最好单独处理刀片,但是你得到了图片。