UVA305 - Joseph(数论 + 打表)
2014-09-19 10:56
429 查看
UVA305 - Joseph(数论 + 打表)
题目链接
题目大意:约瑟夫环问题:n个人围成一圈,每次都淘汰第m个人,问最后一个幸存下来的人的编号。
这题的意思有点不一样,它规定前面的k个人是好人,后面的k个人是坏人(2
∗
k形成环)。问最小的m是多少,能够先把后面的k个坏人淘汰再淘汰好人。
解题思路:这题有个递推式:ai = (ai - 1 + m - 1) % (2
∗
k - (i - 1))
ai表示第i次淘汰的人的编号。后面取余的是剩下的人数。
注意这题的k只可能有14种,但是测试的样例可能有很多,所以要先将每种k的可能对应的值算出来保存下来。不然会超时。
代码:
题目链接
题目大意:约瑟夫环问题:n个人围成一圈,每次都淘汰第m个人,问最后一个幸存下来的人的编号。
这题的意思有点不一样,它规定前面的k个人是好人,后面的k个人是坏人(2
∗
k形成环)。问最小的m是多少,能够先把后面的k个坏人淘汰再淘汰好人。
解题思路:这题有个递推式:ai = (ai - 1 + m - 1) % (2
∗
k - (i - 1))
ai表示第i次淘汰的人的编号。后面取余的是剩下的人数。
注意这题的k只可能有14种,但是测试的样例可能有很多,所以要先将每种k的可能对应的值算出来保存下来。不然会超时。
代码:
#include <cstdio> #include <cstring> using namespace std; const int N = 20;A int solve (int k) { int n = 2 * k; int m = k + 1; int pre, cnt; while (1) { cnt = 1; pre = (m % n) == 0 ? n : m % n; while (cnt <= k) { if (pre <= k) break; pre = (pre + m - 1) % (n - cnt) == 0 ? (n - cnt) : (pre + m - 1) % (n - cnt); cnt++; } if (cnt == k + 1) return m; else { if (m % n == 0) m += k + 1; else m++; } } } int main () { int k; int ans ; for (int i = 1; i < 15; i++) ans[i] = solve(i); while (scanf ("%d", &k) && k) { printf ("%d\n", ans[k]); } return 0; }
相关文章推荐
- UVA305 - Joseph(数论 + 打表)
- UVALive5520 UVA305 POJ1012 HDU1443 Joseph【数学计算+打表+水题】
- uva 305 Joseph(约瑟夫环解+打表)
- UVA 305 Joseph (约瑟夫环 打表)
- Uva 305 Joseph(数学+打表)
- UVA 305 Joseph (约瑟夫环 打表)
- UVa 305 - Joseph
- Uva 305 - Joseph
- UVA 1363 Joseph's Problem(数论)
- UVA 1363 - Joseph's Problem(数论)
- uva305 - Joseph 约瑟夫问题变形
- UVa 1363 (数论 数列求和) Joseph's Problem
- uva 305 - Joseph(暴力)
- UVA 305 - Joseph
- UVA, 305 Joseph
- UVa1363 - Joseph's Problem(数论)
- uva 305 Joseph
- UVA138(数论问题二分打表)
- Joseph - acm.uva.305(约瑟夫环)
- uva 305 Joseph