某企业进行新员工入职前军训,教官让这些新员工进行一个叫做“坚持到底勇士”的活动。挑选N个新员工参与,编号分别为1,2,...N,并且这些员工分别拥有1,2...N枚令牌,这些员工围成圆圈,以1,2,3...为顺时针方向。教官让2个指战员依次交替从顺时针和逆时针方向对这N个员工进行报数。顺时针以1为起始,顺时针方向的报数周期为R。比如R=3,则顺时针第一个被报数选中为编号3的员工,第二次被报数选中为编号6的员工,逆时针以N为起始,逆时针方向的报数周期为L。比如L=2,则逆时针第一次被报数选中为N-1编号的员工,第二次被报数选中为N-3的员工。
每次报数被选中的员工将会“阵亡”,“阵亡”的员工将退出活动(退出的员工将不再参与后续报数),并且将其手中的令牌交给下一个员工(如果编号为k的员工阵亡,并且编号为k+1/k-1的员工都还在活动中,对于顺时针,则令牌交给k+1的员工,对于逆时针,则令牌交给k-1的员工,依次类推)。游戏一直进行到剩下M个员工,其中M=max(L,R)-1,剩下的这M个员工中拥有最多令牌的员工将获得“坚持到底勇士”称号。如果剩下的员工中有不止一个员工拥有最多令牌,则以编号最小获得该称号。请输出该“坚持到底勇士”的编号和他手里的令牌数量。
输入 N[10,100] R[2,6] L[2,6]
输出 编号 令牌数量
输入 10 3 3
输出 7 46
输入 10 2 2
输出 1 55
package zsh;
import java.util.*;
public class CircleList {
public static class Node{
int num;
int card; //令牌数量
Node next;
Node pre;
public Node(int value, int cardNum){
this.num = value;
this.card = cardNum;
}
}
public Node createList(int total){
Node head = new Node(1,1);
Node cur = head;
for(int i = 2; i <= total; ++i){
cur.next = new Node(i, i);
cur.next.pre = cur;
cur = cur.next;
}
cur.next = head;
head.pre = cur;
return head;
}
public Node death(Node head, int total, int numPos, int numRev){
int maxNum = numPos >= numRev ? numPos : numRev;
if(head == null || head.next == head || total < maxNum){
return head;
}
Node curPos = head;
Node prePos = null;
Node curRev = head.pre;
Node preRev= null;
int flag = -1;
List<Node> death = new ArrayList<Node>();
while(true){
//判断是否够一轮
if((total - death.size()) < maxNum){
flag = 1;
break;
}
//判断curPos结点是否还存在链表中,不存在则取next
if(death.contains(curPos)){
curPos = curPos.next;
}
//顺时针
for(int i = 1; i <= (numPos - 1); i++){
prePos = curPos;
curPos = curPos.next;
}
prePos.next = curPos.next;
curPos.next.pre = prePos;
death.add(curPos);
curPos.next.card += curPos.card;
curPos = curPos.next;
//判断
if((total - death.size()) < maxNum){
flag = 0;
break;
}
if(death.contains(curRev)){
curRev = curRev.pre;
}
//逆时针
for(int i = 1; i <= (numRev - 1); i++){
preRev = curRev;
curRev = curRev.pre;
}
preRev.pre = curRev.pre;
curRev.pre.next = preRev;
death.add(curRev);
curRev.pre.card += curRev.card;
curRev = curRev.pre;
}
return (flag == 0 ? curPos : curRev);
//Node res = flag == 0 ? curPos : curRev;
}
//转为list排序
public Node nodeSort(Node head){
List<Node> survivorList = new ArrayList<Node>();
Node cur = head;
int sumCard = 0;
while(!survivorList.contains(cur)){
survivorList.add(cur);
sumCard += cur.card;
cur = cur.next;
}
if(sumCard != 55){ //最后幸存者的card和为55,可以初步验证
System.out.println("ERROR Card");
}
Collections.sort(survivorList, new DesComparator());
return survivorList.get(0);
}
public class DesComparator implements Comparator<Node>{
@Override
public int compare(Node n1, Node n2){
return n2.card - n1.card;
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int[] nums = new int[3];
for(int i = 0; i < 3; i++) {
nums[i] = in.nextInt();
}
in.close();
CircleList zsh = new CircleList();
int total = nums[0];
int numPos = nums[1];
int numRev = nums[2];
Node head = zsh.createList(total);
Node survivor = zsh.death(head, total, numPos, numRev);
Node res = zsh.nodeSort(survivor);
System.out.print(res.num);
System.out.print(" ");
System.out.print(res.card);
}
}