難道是弄個array然後一個一個慢慢數?
好笨的方法……
結果看來也沒其他方法 orz。
由於覺得有別的方法,
於是就用array + linklist的寫法解,
當然指標是很會飄的(抖)。
不過看來我的解法也是一個一個慢慢數,囧。
在網路上看到幾個151的AC code,
不過有些在n = 14時,答案都錯,
看來測資沒有n = 14這組 =w=。
/* ACM 151 Power Crisis
* mythnc
* 2011/11/09 10:55:26
* run time: 0.004
*/
#include <stdio.h>
#define MAXN 99
typedef struct list {
int i;
struct list *next;
struct list *pre;
} List;
void init(List *array, int n);
int findm(List *p, int n);
void link(List *p, int n);
int main(void)
{
List array[MAXN];
int n;
while (scanf("%d", &n) && n != 0) {
init(array, n);
printf("%d\n", findm(array, n));
}
return 0;
}
/* init: initialize array */
void init(List *array, int n)
{
int i;
for (i = 0; i < n; i++)
array[i].i = i + 1;
}
/* findm: find and return the number m */
int findm(List *ary, int n)
{
int count, i, m;
List *p;
for (m = 1; ; m++) { /* find m */
link(ary, n); /* link all again */
p = ary;
count = 1;
while (count < n) {
p->pre->next = p->next; /* link arrange */
p->next->pre = p->pre;
for (i = 0; i < m; i++) /* move */
p = p->next;
count++;
if (p->i == 13) {
if (count == n)
return m;
break;
}
}
}
}
/* link: link array elements one by one
* in a circle */
void link(List *p, int n)
{
int i;
i = 0;
p[i].next = &p[i + 1];
p[i].pre = &p[n - 1];
for (i = 1; i < n - 1; i++) {
p[i].next = &p[i + 1];
p[i].pre = &p[i - 1];
}
p[i].next = &p[0];
p[i].pre = &p[i - 1];
}
沒有留言:
張貼留言