Poj 1012
2017-07-05 本文已影响31人
86棵梦
不知不觉毕业五年了,看了下 poj,上一次 submmit 竟然是在 13 年 10 月份,逝者如斯。
具体代码如下,以后有时间再更新思路。
#include <iostream>
// 用来记录结果,避免重复计算
int result[20] = {0};
// n 为最终的结果,k 为人数,这个函数是用来计算两个值是否匹配
bool isRight(int n, int k) {
//代表每一轮剩余的数量
int remain[20] = {0};
remain[0] = 0;
for (int t = 1; t <= k; t ++) {
// 每一轮单位长度
int unitLength = 2 * k - t + 1;
int lengthForThisTurn = n - remain[t - 1];
if (lengthForThisTurn <= k) {
return false;
}
if (lengthForThisTurn <= unitLength) {
remain[t] = unitLength - lengthForThisTurn;
} else if (lengthForThisTurn > unitLength) {
int remainder = lengthForThisTurn % unitLength;
if (remainder == 0) {
remain[t] = 0;
} else if (remainder > k) {
remain[t] = unitLength - remainder;
} else {
return false;
}
}
}
return true;
}
// 计算总的数量,有剪枝
int calculateJosef(int k) {
int i = 1;
while (true) {
int n = i * (k + 1);
if(isRight(n, k)) {
return n;
}
if (isRight(n + 1, k)) {
return n + 1;
}
i ++;
}
}
int main(int argc, const char * argv[]) {
int k;
while (scanf("%d", &k) && k != 0) {
if (result[k] == 0) {
result[k] = calculateJosef(k);
}
printf("%d\n", result[k]);
}
return 0;
}