uva 305 Joseph
2013-07-31 20:30
309 查看
点击打开链接uva 305
思路: 数学+打表
分析:
1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号
2 这一题是前k个人是好人,后面k个是坏人。现在要求最小的m使得没有一个好人被踢出去的情况下k个坏人都被踢出
3 按照传统的方法来分析的话,n个人的编号从0~n-1
第一次 a[1] = (m-1)%n; // 这里由于人的编号是0~n-1
第二次 a[2] = (a[1]+m-1)%(n-1);
第i次 a[i] = (a[i-1]+m-1)%(n-i+1);
那么我们可以知道每次的删除的人的编号,由于k最大14所以我们可以先打表找到1~14的解,然后输出即可。
代码:
思路: 数学+打表
分析:
1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号
2 这一题是前k个人是好人,后面k个是坏人。现在要求最小的m使得没有一个好人被踢出去的情况下k个坏人都被踢出
3 按照传统的方法来分析的话,n个人的编号从0~n-1
第一次 a[1] = (m-1)%n; // 这里由于人的编号是0~n-1
第二次 a[2] = (a[1]+m-1)%(n-1);
第i次 a[i] = (a[i-1]+m-1)%(n-i+1);
那么我们可以知道每次的删除的人的编号,由于k最大14所以我们可以先打表找到1~14的解,然后输出即可。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int solve(int k){ int pre; int tmp = k+1; int n = 2*k; while(tmp){ if((tmp-1)%n >= k && (tmp-1)%n < 2*k){ pre = (tmp-1)%n; int i; for(i = 2 ; i <= k ; i++){ int x = (pre+tmp-1)%(n-i+1); if(x < k || x >= 2*k) break; else pre = x; } if(i == k+1) return tmp; } tmp++; } } int main(){ int k , ans[20]; 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(数论 + 打表)
- uva 305 Joseph
- UVa 305 - Joseph
- UVA 305 Joseph
- Uva305——Joseph
- UVA, 305 Joseph
- 约瑟夫循环问题uva305 Joseph
- UVA 305 Joseph (约瑟夫环 打表)
- uva305 - Joseph 约瑟夫问题变形
- Uva 305 Joseph(数学+打表)
- UVA 305 - Joseph
- uva 305 - Joseph(暴力)
- uva 305 Joseph
- UVALive5520 UVA305 POJ1012 HDU1443 Joseph【数学计算+打表+水题】
- UVa 305 / POJ 1012 Joseph (如何得到约瑟夫环的下一个位置?)
- Uva 305 - Joseph
- UVA305 - Joseph(数论 + 打表)
- uva 305 Joseph(约瑟夫环解+打表)
- Joseph - acm.uva.305(约瑟夫环)
- UVA 305 Joseph (约瑟夫环 打表)