殺人遊戲(hdu2211)插入法

尋找&星空の孩子發表於2013-08-13

殺人遊戲

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1375    Accepted Submission(s): 267

Problem Description
不知道你是否玩過殺人遊戲,這裡的殺人遊戲可沒有法官,警察之類的人,只有土匪,現在已知有N個土匪站在一排,每個土匪都有一個編號,從1到N,每次殺人時給定一個K值,從還活著的土匪中,編號從小到大的找到K個人,然後殺掉,繼續往下,直到找遍,然後繼續從剩下的土匪中,編號從小到大找到第K個活著的土匪,然後殺掉。比如,現在有10個土匪,K為3,第一次殺掉3,6,9號的土匪,第二次殺掉4,8號土匪,第三次殺掉5號土匪,第四次殺掉7號土匪,第五次殺掉10號土匪,我們看到10號土匪是最後一個被殺掉的(從1到K-1的土匪運氣好,不會被殺!)。現在給定你一個N和一個K,問你最後一個被殺掉的土匪的編號是多少。
 
Input
第一行有一個T(T<=10000),接下來有T組資料,每組中包含一個N(N<2^31)和一個K(3<=K<=100&&K<N)。
 
Output
對於每組資料,輸出最後被殺的土匪的編號。
 
Sample Input
1
10 3
 
Sample Output
10
 
拖了好久啊,,,,,,今天要謝謝老闆哈!插數,,,原來如此!
 
這是一道很有趣的題目,
 
 
#include<stdio.h>
int main()
{
    __int64 t,n,k,count,luck,s,p,i;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&k);
        p=k-1;//插入週期eg:k=3,那麼p=2;兩個一插
        for(s=k;s<n;)//s為標記,來標記luckboy的位置
        {
            i=(s-1)/p;//計算s前面插幾個
            luck=s;//luck是記錄上一個s的值
            s=s+i;    
        }
        printf("%I64d\n",luck);
    }
    return 0;
}

以題例為例,他的流程圖如下,s代表luck boy的位置,數字帶下劃線表示剛插入的數

是不是 so easy 啊!    關鍵是方法!!!

1 2 s(3)

1 2 3 s(4)

1 2 3 4 s(5) 6

1 2 3 4 5 6 s(7) 8 9

1 2 3 4 5 6 7 8 9 s(10) 11 12 13

 

夠短小吧,再者我之前的程式碼是:

 

 #include<stdio.h>
int main()
{
    int t,k;
    __int64 i,j,n,count,p;
    __int64 a[100000],luck;
    
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%d",&n,&k);
        for(i=1;i<=n;i++)
            a[i]=i;
        count=0;
        for(i=k;i<=n;i++)
        {
            if(a[i]%k==0)
            {a[i]=0;count++;}

        }
        for(i=1,j=0;(n-count)>=k;i++)
        {
            
            
            if(a[i]!=0)
                j++;
            if(j==k)
            {luck=a[i];a[i]=0;count++;j=0;}
            if(i==n)
            {i=0;j=0;}
        }
        printf("%I64d\n",luck);

    }
    return 0;

}

 

這就是差距,大神就是大神,學長牛牛,,,我也要加油

 

 

相關文章