POJ3750
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int main() { int i,j,w,s,n; char a[65][16]; int p[65]; scanf("%d",&n); for(i=1;i<=n;i++) { p[i]=i; scanf("%s",&a[i]); } scanf("%d,%d",&w,&s); w=(w+n)%n; while(n-1){ w=(w+s-1)%n; printf("%s\n",a[p[w]]); for(j=w;j<n;j++) p[j]=p[j+1]; n--; cout<<w<<" "<<n<<endl; } return 0; } //WA代码↑
POJ3750
题意:约瑟夫环问题。
输入:
n(人数)
str(人的姓名)
w(起始下标)s(间隔人数)
输出:
str(人的姓名)
思路:约瑟夫环问题,直接模拟起始w=(w+n-1)%n,出去下标w=(w+s-1)%n,在后面要把环的下标更新即可。
AC代码:
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int main() { int i,j,w,s,n; char a[65][16]; int p[65]; scanf("%d",&n); for(i=0;i<n;i++) { p[i]=i; scanf("%s",&a[i]); } scanf("%d,%d",&w,&s); w=(w+n-1)%n; while(n){ w=(w+s-1)%n; printf("%s\n",a[p[w]]); for(j=w;j<n-1;j++) p[j]=p[j+1]; n--; // cout<<w<<" "<<n<<endl; } return 0; }