POJ 1012--Joseph
2017-07-06 23:39
357 查看
题意
题目的大概意思是,有2*K个人站一排,左边是好人,右边是坏人,现从最左边开始报数,每报到m便杀掉此人,求m为多少时能保证每次都杀到坏人,直到杀完坏人为止。分析
先考虑最后只剩下K+2个人的时候,此时要么杀第k+1个要么杀k+2个,那么最后一轮报数时就可能从第k+1(原k+1号被杀,k+2号变为k+1)个人或者第1个人(原k+2被杀)开始报数。因此便有(k+1+m-1)%(k+1)=0或(1+m-1)%(k+1)=0,所以m为n(k+1)或者n(k+1)+1。另外每次计算所得需要存储下来,会有重复的k输入。代码如下:
Memory: 248K Time: 32MS Length:66LINES
#include<iostream> using namespace std; int main() { int Box[14] = { 0 }; int temp = 0; while (cin >> temp&&temp != 0) { if (Box[temp] != 0) { cout << Box[temp] << endl; continue; } int j = 1; while (true) { int m = j * (temp + 1); int start = 1; int kill = 0; int sum = 2 * temp; while (sum > temp) { kill = (m + start - 1) % sum; if (kill == 0) { start = 1; kill = sum; } else start = kill; if (kill <= temp) break; --sum; } if (kill == temp + 1) { Box[temp] = m; cout << m << endl; break; } m = j * (temp + 1) + 1; start = 1; kill = 0; sum = 2 * temp; while (sum > temp) { kill = (m + start - 1) % sum; if (kill == 0) { start = 1; kill = sum; } else start = kill; if (kill <= temp) break; --sum; } if (kill == temp + 1) { Box[temp] = m; cout << m << endl; break; } ++j; } } return 0; }
相关文章推荐
- [POJ1012]Joseph
- POJ 1012 Joseph 约瑟夫问题
- poj 1012 Joseph
- POJ 1012(Joseph)
- poj 1012 & hdu 1443 Joseph(约瑟夫环变形)
- POJ 1012: Joseph
- POJ 1012 Joseph 约瑟夫问题
- POJ1012 Joseph
- poj 1012 Joseph
- POJ 1012 Joseph 约瑟夫问题
- poj1012——Joseph
- poj 1012 Joseph
- POJ 1012 Joseph
- poj1012 Joseph题解2
- POJ 1012 Joseph
- POJ 1012 Joseph
- poj 1012 Joseph 约瑟夫问题 (★★☆☆☆)
- poj1012.Joseph(数学推论)
- poj_1012joseph
- poj-1012 Joseph