POJ1012 打表&&约瑟夫问题详解
2016-01-22 20:06
260 查看
题意:
约瑟夫问题的变形,总共k个好人和k个坏人,好人先排在坏人前面,寻找一个最小的m,使每次杀的都是坏人,保证坏人比好人先死
要点:
先打表把1-14的所有情况都赋值给一个数组,然后直接对应输出就行
约瑟夫问题:
维基百科:点击打开链接
百度百科:点击打开链接
设拿走k个的位置为ans[k],ans[k]=(ans[k-1]+m)%(n-k)
代码如下:
约瑟夫问题的变形,总共k个好人和k个坏人,好人先排在坏人前面,寻找一个最小的m,使每次杀的都是坏人,保证坏人比好人先死
要点:
先打表把1-14的所有情况都赋值给一个数组,然后直接对应输出就行
约瑟夫问题:
维基百科:点击打开链接
百度百科:点击打开链接
设拿走k个的位置为ans[k],ans[k]=(ans[k-1]+m)%(n-k)
15095637 | Seasonal | 1012 | Accepted | 156K | 250MS | C++ | 493B | 2016-01-22 19:36:07 |
#include<stdio.h> #include<stdlib.h> #include<string.h> int ans[15], data[15];//ans代表杀掉的人的位置 void ins() { for (int k = 1; k < 14; k++) { int m = 1; memset(ans, 0, sizeof(ans)); for (int i = 1; i <= k; i++) { ans[i] = (ans[i - 1] + m-1) % (2 * k - i+1 );//i代表杀掉的人数 if (ans[i] < k)//这里小于已经上面m-1都是为了考虑k=1的情况 { i = 0; //i后面要已经++,其实就是从1开始 m++; } } data[k] = m; } } int main() { ins(); int k; while(scanf("%d",&k)==1,k) printf("%d\n", data[k]); return 0; }
相关文章推荐
- Educational Codeforces Round 6
- unity3d教程动态创建简单平面地形
- backbone-todo案例分析
- Python学习笔记——基础篇(1): 变量及其类型
- OC中简单的界面设置
- Object-C--->Swift之(六)函数类型
- Fraction to Recurring Decimal leetcode
- ubuntu 安装 netbeans C++ IDE
- wep.py输出hello world
- iOS tabview 复用机制详解
- java.lang.IllegalThreadStateException: Thread already started
- java 实现简单的日历查询
- Mavne关于clean的问题
- bzoj3224 普通平衡树
- Storm 学习笔记(1-4)
- UI基础整理-14
- hdu 1242 Rescue
- get新技能!做excel表格超实用技巧大汇总
- Best way to determine if two path reference to sam
- 凸包——Graham-Scan算法