1192 约瑟夫问题(1)
生活随笔
收集整理的這篇文章主要介紹了
1192 约瑟夫问题(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1192?約瑟夫問題(1)
Time Limit :?2000/1000 MS(Java/Others)?| Memory Limit :65536/32768 KB(Java/Others)
Submits :?1235?| Solved :?716
Description
模擬這個游戲。有n個人圍成一圈,從第一個人開始沿順時針方向報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那個人?Input
輸入一個整數n。(n<=1000)Output
輸出最后剩下的數。Sample Input
5Sample Output
4HINT
Source
NBU OJ 解題思路:解題方法:用了模擬法,也就是通過數組來模擬這個報數的過程,設置兩個數組其中一個用來存儲開始準備報數的編號,后一個數組用來對報完數后的編號進行更新,例如:a{123} 報到3的時候把3去掉也就是a[3]=0(我這邊是從一開始),然后剩下更新就由b數組來操作,其中_index為數組下標,下標之所以等于(flag+i)%ans 例如 12 當從1開始報數的時候報到3時候又回到下標1,以此類推,歐了。 代碼:import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc=new Scanner(System.in);//12345 1245 245 24 4int n=sc.nextInt();int a[]=new int[1000];int b[]=new int[1000];for(int i=1;i<=n;i++){a[i]=i;b[i]=i;}int ans=n;int _index=0;int flag=0;while(ans>1){for(int i=1;i<=3;i++){_index=i+flag;if(_index>ans)_index=_index%ans;if(i==3){a[_index]=0;ans--;}}if(_index==a.length){_index=1;}flag=_index;int m=1;for(int i=1;i<=n;i++){if(a[i]!=0){b[m++]=a[i];}else{flag-=1;}}a=b;}System.out.println(a[1]);}}總結
以上是生活随笔為你收集整理的1192 约瑟夫问题(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html之添加注释
- 下一篇: 网络流之最大流算法(EdmondsKar