LA3882 And Then There Was One】的更多相关文章

And Then There Was One https://vjudge.net/problem/UVALive-3882 题目大意:n个数编号1..n排成一圈,第一次删除m,后来每k个删除一个(下一次删除m + k....),问最后剩下哪一个? 先考从0开始数,每k个删除一个.设f[i]表示共有i个数最后剩下的数是多少. 考虑删除k - 1后,第k个数重新标号为0,第k + 1重新标号为1.......,变成了i-1个数的情况,而i个数的情况标号是i-1个数的标号 + k得到的 有f[i]…
题目大意: N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k<=10000 目测会直接TLE. 那么有没有其他的方法呢?答案是有的. 我们先忽略掉m, 分析一下每k个数删除一次,那就是经典的约瑟夫问题了. 那么,将每个数(1~n)按顺序编号为0~n-1 设第一个删除的数的编号为x,删除x后,剩下的n-1个数可以组成一个新的约瑟夫环 重新为新的环编号,原先为x+1的现在编号变为0…
做sb题也是一种乐趣,是吧…… #include<bits/stdc++.h> #define N 10005 using namespace std; int f[N],m,n,k; int main(){ while(scanf("%d%d%d",&n,&k,&m)&&n){ ; ;i<=n;i++)a=(a+k)%i; a=(m-k++a)%n;)a+=n; printf("%d\n",a); } }…