我给队列的初始位置从该行的前面的1增加到后面的 n 。
队列中的任何人都可以贿赂在他们前面的人以交换职位。如果两个人调换职位,他们仍然会贴上相同的标签,以表示他们原先的位置。一个人最多可以贿赂另外两个人。例如,如果 n = 8 和人员5 贿赂人员4 ,则队列将如下所示: 1,2,3 ,5,4,6,7,8 。
最小数量必须打印一个整数,代表创建原始队列所需的最小贿赂数;如果无法进行线路配置,则太混乱。如果一个人的贿赂数不超过2,则线路配置是不可能的。
minimumBribes具有以下参数:
样本输入
2
5
2 1 5 3 4
5
2 5 1 3 4
输出
3
Too chaotic
使用排序逻辑,我刚刚算出了一个人,该数字早于并且追随人。如果可能的话,还可以打印行贿总数,否则会打印太混乱消息。
static void minimumBribes(int[] q) {
int count = 0; // Counts the no of bribes by an individual.
int j;
int total = 0; // Total no of bribes.
loop1 : for(int i = 0; i < q.length; i++) {
loop2 : for(j = i; j < q.length; j++) {
if(q[i] > q[j]) {
count++;
if(count > 2) {
System.out.println("Too chaotic");
break loop1;
}
}
else if (q[i] <= q[j]) {
total += count;
count = 0;
}
}
}
if(count <= 2)
System.out.println(total);
}
上面提到的代码可以在较小的队列中完美运行,但是如果数组较大,则超出了固定的处理时间限制。
答案 0 :(得分:1)
我刚刚在python中解决了这个问题,以更好地理解问题。
我决定从队列中的最后一个人开始,因为我们可以立即就此人说几件事:
我们可以将此规则应用于从人SelectLanguage
到人N
的所有人。
伪代码:
1
FOR PERSON in [N to 1]:
P = PERSON
IF (P MORE THAN 2 POSITIONS FROM INITIAL POS; OR P IS FURTHER BACK IN QUEUE):
PRINT 'Too chaotic'
RETURN
FOR POS in [CURR_POS[P] to INIT_POS[P]]:
SWAP POSITION OF P AND PERSON_TO_THE_RIGHT_OF_P
INCREMENT COUNT OF BRIBES BY 1
PRINT COUNT_OF_BRIBES
是指此人在行贿之前的初始位置,因此INIT_POS[P]
INIT_POS[PERSON_5] = 5
指算法开始时或进行任何交换后CURR_POS[P]
的当前位置。
在该算法的结尾,(假设贿赂不是混乱的)以下常量应该成立:P
。原因是因为我们正在做的就是在所有贿赂发生之前将所有人移回原来的位置。
答案 1 :(得分:0)
static void minimumBribes(int[] q) {
int count = 0; // Counts the no of bribes by an individual.
int total = 0; // Total no of bribes.
loop1 : for(int i = 0; i < q.length; i++) {
if((q[i]-(i+1))>2){//original position i should be person i+1
System.out.println("Too chaotic");
break loop1;
}
else if((q[i]-(i+1))>0){
count=q[i]-(i+1);
total += count;
count = 0;
}
}
if(count <= 2) //not sure what dose this sentence do?
System.out.println(total);
}
这是您的要求吗?不确定我正确理解了您