取數遊戲:A與B玩取數遊戲,隨機產生的2n個整數排成一列,只顯示兩端的整數,只有當A或B取完數會顯示下一個數或者是前一個數(如果取末尾的數)算法
A的取數策略:採用貪心策略,每次取數取兩個數中最大的那個數數組
B的取數策略:當兩個數相差較大,取大的那個數,若相差爲1,則在這兩個數中隨意取一個數dom
模擬A與B的取數過程code
隨機產生數值,咱們使用Java中的Math.random()方法便可blog
爲了方便取數,將隨機產生的2n個整數放在鏈表中,鏈表中有方法能夠取出第一個數和最後一個數遊戲
getFirst()
返回第一個元素的數值,不將該元素移出鏈表rem
removeFirst()
將第一個元素鏈表鏈表,返回該元素的數值get
getLast()
返回最後一個元素的數值,不將該元素移出鏈表ast
removeLast()
將最後一個元素移出鏈表,返回該元素的數值變量
設置一個布爾變量flag
,flag=true
輪到A取數flag=false
輪到B取數
分別用兩個一維數組存放A與B的取數
A取數採用貪心策略,咱們使用get方法,得到一個數和最後一個數,取大數存放在A數組中
B取數有兩個選擇,相差較大(也就是相差大於1),咱們就取大數(這裏咱們在實際當中須要採用絕對值
);
如果等於1,則隨意取,咱們能夠使用隨機數的方法,如果隨機數大於0.5,則取第一個數,不然取末尾那個數
若是是A先取數的話,B到最後會出現只剩下一個數的狀況,這個時候B沒有選擇,只能取這個數
判斷輸贏的話,只須要比較A數組的總和與B數組的總和便可判斷出輸贏
Scanner scaner = new Scanner(System.in); int n = scaner.nextInt(); scaner.close(); LinkedList<Integer> list = new LinkedList<Integer>(); int[] A = new int[n];//存放A所取的數值 int[] B = new int[n];//存放B所取的數值 for(int i=0;i<2*n;i++){ int temp=(int)(Math.random() * 100) ;//0到100的隨機數 list.add(temp);//存入鏈表中 } boolean flag = true;//A先取數 int count = 0; //當B數組的最後一個不爲0的時候(便是B拿到了最後一個數的時候),退出while while(count<n){ if(flag){ if(list.getFirst()>list.getLast()){ A[count] = list.removeFirst(); }else{ A[count]=list.removeLast(); } System.out.println("A取"+A[count]); flag=false; //改變flag,輪到B取數 }else{ if(list.getFirst()==list.getLast()){//當還剩下一個數的時候,B只能取當前那個數 B[count]=list.removeFirst(); }else if(list.getFirst()-list.getLast()>1){ B[count] = list.removeFirst();//選擇最大的那個數 }else if(Math.abs(list.getFirst()-list.getLast())==1){ //B隨機選擇 if(Math.random()>0.5){ B[count]=list.removeLast(); }else{ B[count]=list.removeFirst(); } }else{ B[count]=list.removeLast();//第一個數比末尾的數要小,由於上述條件已經排除了等於1的狀況,因此末尾的數必定是與第一個數相差較大 } System.out.println("B取"+B[count]); count++; flag = true;//輪到A取數 } } int a=A[0],b=B[0]; //判斷輸贏 for(int i=1;i<A.length;i++){ a = a+A[i]; b = b+B[i]; } if(a>b){ System.out.println("A獲勝了"); }else{ System.out.println("B獲勝了"); }