POJ 1012 Joseph

來源:互聯網
上載者:User

考驗思維能力的一道題

一開始用了最笨的方法,一個一個數,結果k到10就跑不出來了

 

後來看了discuss,可以推公式,這樣就可以直接推得下一個殺人的位置,不必一個一個數了,時間可以節省非常多,自己找了小點的k嘗試了下,推出了公式,我們從點1開始編號,則初始情況一共有2*k個點

假設b為已經殺掉的人數,now為現在的起始位置,next為下一個殺掉人的編號,初始時,b=now=0

 

則第一步,next=(0+m-1)%(2k-0)+1,(減1模數後再加1,為了防止0的出現),編號為next的人被殺掉,注意,此時的now不是next,而是next-1!然後再迴圈找下去就行,next=(now+m-1)%(2*k-b),由於不需要知道被殺掉的人原來的編號,殺掉這個人後,我們可以把整個環的數量減1,而所有壞人和好人都是還是各自連在一起的,所以不會有影響

 

後來看了discuss後,經牛人點撥,得知m必定為k+1的整數倍或者k+1的整數倍加1,為什麼呢?考慮只剩下兩個壞人時,他們此時的編號為k+1和k+2,如果殺掉的是k+1,那麼走m=n*(k+1)+1步後可以殺掉原來編號為k+2的人,而如果先殺掉的是原來編號為k+2的,那麼走m=n*(k+1)步後可以殺掉原來編號為k+1的人。這個解釋太精彩了!這樣最佳化後,可以從200多ms跑到100ms左右

 

總結:做題就是這樣的,先從最笨的方法開始,然後在此基礎上進行最佳化,另外,對於一些規律性的東西,可以從特殊情況或者最簡單的情況去挖掘資訊!還有,這題有很多組測試資料,但最多13種情況,我們可以將某種情況算出來的結果儲存下來,下次再測試時直接輸出!

 

代碼:

#include<iostream><br />#include<memory.h><br />#include<string><br />#include<cstdio><br />#include<algorithm><br />#include<math.h><br />#include<stack><br />#include<queue><br />using namespace std;<br />int f[100];<br />bool go(int m,int k)<br />{<br />int i,j,cnt,now,next,b=0;<br /> cnt=j=0;<br /> i=-1;<br /> now=0;<br /> while(true)<br /> {<br /> //cout<<"now="<<now<<endl;<br />next=(now+m-1)%(2*k-b)+1;<br />//cout<<"next="<<next<<endl;<br />if(next<=k)<br />return false;<br />else<br />{<br />now=next-1;//注意,殺掉的人被刪除了,起點要減1<br />b++;//刪掉的人數加1<br />cnt++;<br />if(cnt==k)<br />return true;<br />}<br /> }<br />}<br />int main()<br />{<br />int i,j,cnt,k,m,flag;<br />memset(f,0,sizeof(f));<br />while(scanf("%d",&k)!=EOF)<br />{<br />if(!k)<br />break;<br />if(f[k])<br />{<br />cout<<f[k]<<endl;<br />continue;<br />}<br />for(m=k+1;;m++)<br />{<br />//int t=m%(2*k);//m=i*(2*k)+j,i為整數,k<j<=2*k<br />if(m%(k+1)>1)//m為k+1的整數倍,或者k+1的整數倍加1<br />continue;<br />//if(t&&t<=k)<br />//continue;<br /> if(go(m,k))<br /> break;<br /> //if(t==0)<br /> //m+=k;<br />}<br />f[k]=m;<br />cout<<m<<endl;<br />}<br />return 0;<br />}<br /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.