LA 3882

动态规划;

白书上的题,看了好久看不懂刘汝佳的解法;

在网上无意中看到了大神的思路,比较好理解,膜拜!

他的思路是这样的:

设d[i]是n个数按顺时针方向分别从0开始编号,第一次删除0,以后每k个数删除一个,最后剩下的数。

实际上d[i]就是顺时针偏移了多少位。

状态转移方程:

d[i] = (k - 1 + d[i-1]) % (n-1) + 1;

(删了0后,剩下1,2,...,n,全部减1后得到0,1,2,...,n-1,所以原来该删k——>>k-1,顺时针偏移d[i-1]位,取模,加1后变回原来的编号)

代码:

 1 #include<cstdio>
 2 #define maxn 10009
 3 using namespace std;
 4 int d[maxn];
 5 
 6 int main()
 7 {
 8     int n,m,k;
 9     d[1]=0;
10     while(scanf("%d%d%d",&n,&k,&m)&&(m+n+k))
11     {
12         for(int i=2;i<=n;i++)d[i]=(d[i-1]+k-1)%(i-1)+1;
13         int ans=(m-1+d[n])%n+1;
14         printf("%d
",ans);
15     }
16     return 0;
17 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3354554.html