第一次ACM

2008-5-31 评论(1) 分类:技术文章 Tags:

昨天被人叫去看了一个人的空间,突然有兴趣试试ACM。最近一直在看RIA相关的博客,了解了挺多,但开始怀疑自己有没有在进步。。网页相关方面 是进步了,但编程能力毫无疑问完全没长进,在没有实践的日子里,做下纯编程的东西还是挺好的,算法、编程能力是基础~~做了即使没成绩也有好处没坏处。很 久没编程,昨晚那么一试,竟然试到我睡不着。。本来一个多小时做完没再碰了,但我的脑袋估计是太久没运转了,一下子过度使用,搞到要睡觉的时候还十分活 跃,睡不着。。。这题提交了4次才被Accepted。。看到这个单词挺有成就感的~~呵~~~也许我对这个会三分钟热度,随我喜好了~~呵呵。。

此题是problem 1088:System Overload,类似于以前在课本上看到的“一群孩子围成一圈数数出列”的一道题,自然是简单题~~

#include <iostream>
using namespace std;
int a[150];
int b[150];
int m,n=1,r,p,cn;
void init(){
    for(int i=0;i<150;i++)
        a[i]=0;
    m=0;
    r=0;
    p=0;
}
void popAt(int num,int cn){
    while(num<cn){
        a[num]=a[num+1];
        num++;
    }
    a[cn]=0;
}
int calculate(int n){
    init();
    while(r!=2){
        for(int i=0;i<n;i++)
            a[i]=i+1;
        m++;
        cn=n;
        popAt(0,cn-1);
        cn--;
        p=m;
        while(cn>1){
            while(p>cn)
                p-=cn;
            popAt(p-1,cn-1);
            cn--;
            p+=m-1;
        }
        r=a[0];
    }
    return m;
}
int main()
{
    int k=0;
    while(n!=0){
        cin>>n;
        if(n==0) break;
        if(n<3||n>150) return 0;
        b[k]=calculate(n);
        k++;
    }
    for(int j=0;j<k;j++){
        cout<<b[j]<<endl;
    }
    return 0;
}