算法问题

时间:2011-01-09 22:28:21

标签: algorithm

我正在尝试为此问题找到O (n)算法,但即使花了3-4个小时也无法这样做。蛮力方法超时(O (n^2))。我很困惑如何做到这一点?该解决方案是否需要动态编程解决方案?

http://acm.timus.ru/problem.aspx?space=1&num=1794

简而言之,问题是:

有些学生坐在圈子里,每个学生都有自己的选择,希望何时可以向老师提问。老师只会按顺时针顺序提问。例如:

5

3 3 1 5 5

这意味着有5名学生和:

1st student wants to go third
2nd student wants to go third
3rd student wants to go first
4th student wants to go fifth
5th student wants to go fifth.

问题在于教师应该从哪里开始提问,以便最多的学生能够按照自己的意愿获得转机。对于这个特定的例子,答案是5,因为

3 3 1 5 5

2 3 4 5 1

你可以看到,从第五名学生开始作为第一名,2名学生(3名和5名)正在获得他们想要的选择。对于这个例子,答案是第12名学生:

12

5 1 2 3 6 3 8 4 10 3 12 7

,因为

5 1 2 3 6 3 8 4 10   3 12 7

2 3 4 5 6 7 8 9 10 11 12 1

四名学生完成了他们的选择。

1 个答案:

答案 0 :(得分:4)

这实际上是一个相当简单的问题。如果学生k希望成为第j个呈现,那么如果(k-j + 1)th(modulo n)是第一个出现,她将会感到满意。这应该会引导您使用简单的O(n)算法。