本題為互動題
42是一個神聖偉大的數字,它是世上一切問題的最終答案,詳情參見wiki,因此我們想要找出42!!!
現在有一個長度為$n$但內容未知由2與4組成的序列$a$,已知$a_1=4,a_n=2$,現在你每次可以詢問位置$i$的值$a_i$,請找出一個位置$x$符合$a_x=4且a_{x+1}=2$。
以下為範例程式(此程式符合規定且能拿到部分分,但是無法AC本題):
#include<iostream> using namespace std; int main() { int t; cin>>t; for(int _t=1;_t<=t;_t++){ int n; cin>>n; for(int i=1;i<n;i++){ // test if position i is a solution int r1,r2; cout<<"? "<<i<<endl; cin>>r1; // the value of a[i] cout<<"? "<<i+1<<endl; cin>>r2; // the value of a[i+1] if(r1==4&&r2==2){ // find a solution cout<<"! "<<i<<endl; // guess i int res; cin>>res; if(res==1) break; // guess right, continue the program else return 0; // guess wrone, terminate the program } } } return 0; }
一開始讀入一個正整數$T$代表測資筆數 ($T\le 5$)。
每筆測資一開始先讀入一個正整數$n$代表序列長度 ($n\le 10^9$)。
之後每次你可以選擇做出以下兩種操作:
1. 輸出"? i"(不含引號)代表你要詢問位置$i$的值,之後再讀入一個2或4的數字代表$a_i$的值。
2. 輸出"! x"(不含引號)代表你猜測答案$x$,之後再讀入一個0或1的數字代表是否正確,若讀到1代表回答正確,將繼續開始下一筆測資(若為最後一筆測資則結束程式),若讀到0代表回答錯誤,請直接結束程式否則可能會得到不可預期的結果。
若未按上述規定輸入輸出皆為不可預測行為。
測資點0的$n\le 1000$。
測資點1的$n\le 10^9$且為隨機測資。
測資點2的$n\le 10^9$且為固定測資。
測資點3的$n\le 10^9$且測資會根據使用者的詢問而調整(adaptive)。
在不TLE的前提下你能不限次數的詢問位置,若詢問次數過多則會得到TLE(經測試你大約能詢問每個測資點100000次)。
1 6 4 4 4 4 4 2 1
? 1 ? 2 ? 2 ? 3 ? 3 ? 4 ! 3
範測為範例程式跑單筆測資$n=6$且$a=[4,4,4,2,4,2]$的結果
每次輸出後請務必要flush,否則可能會得到TLE。
c++ IO的flush方法(如果你是用endl換行則不需要):cout<<flush;
c IO的flush方法:fflush(stdout);
由於一些奇怪的因素,若你看到SE那應該也是TLE,未來會再想辦法改善此問題。
請勿使用java與python
編號 | 身分 | 題目 | 主題 | 人氣 | 發表日期 |
沒有發現任何「解題報告」 |