殺人遊戲
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; }
這就是差距,大神就是大神,學長牛牛,,,我也要加油