POJ3750

时间:2021-03-07 16:06:47
#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;
}

相关文章