dp思路的题,想了3次,一天半还是想明白了。
还有说网上的一些资料查查还是很有用的。
紫书上的代码是这样的:
#include<bits/stdc++.h>
using namespace std;
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;
}
懂了是从0开始,每次k删除,地推答案是f[n]
然而很难理解最终答案f[n]+1+m-k
看了这题代码就明白了:
#include <stdio.h>
#include <string.h>
int n, k, m;
int main() {
while (~scanf("%d%d%d", &n, &k, &m) && n + k + m) {
int ans = 0;
for (int i = 2; i <= n - 1; i++)
ans = (ans + k) % i;
printf("%d\n", (ans + m) % n + 1);
}
return 0;
}
也就是第一次的时候删除的是m,从m开始从新编号,+m-k,就是减掉了最后加的那个k