链表法超时。递推找规律。n 总数,m第一个去掉哪一个,k数几个去掉。
#include <iostream>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
struct node
{
int num;
node *next;
node *per;
};
void creat(node *head ,int n)
{
node *cur;
cur = head;
for(int i = 2 ;i <= n ; i ++ )
{
node *temp = new node();
temp -> num = i;
cur -> next = temp;
temp -> per = cur;
cur = temp;
}
cur -> next =head;
head -> per = cur;
}
void john(node *head , int m ,int n ,int k)
{
int sum = 0;
int num = 1;
node *cur = head;
for(int i = 1 ; i < m ; i ++ )
{
cur = cur -> next ;
}
cur -> per -> next = cur -> next;
cur -> next -> per = cur -> per;
cur = cur -> next;
sum ++ ;
for(int i = 0 ; ; i ++ )
{
if(num == k)
{
cout <<cur -> num <<endl ;
cur -> per -> next = cur -> next;
cur -> next -> per = cur -> per;
sum ++ ;
if(sum == n-1)
{
cur = cur-> next;
break;
}
num = 0;
}
cur = cur -> next ;
num ++ ;
}
cout << cur->num <<endl;
}
int main()
{
int n , m , k ;
while(cin >> n >> k >> m)
{
node *head;
head = new node();
head->num = 1;
creat(head , n);
john(head , m , n ,k);
}
}
wa,和刘汝佳训练指南写的一模一样
#include <cstdio>
const int maxn = 10000 + 2 ;
int f[maxn];
int main()
{
int n , k , m ;
while(scanf("%d%d%d" ,&n ,&k , &m)== 3 && n)
{
f[1] = 0;
for(int i = 2 ; i <= n ;i ++ ) f[i] = (f[i - 1] + k) % i;
int ans = (m - k + 1 + f[n]) %n;
if(ans < 0) ans += n;
printf("%d\n" , ans);
}
return 0;
}