a291: 42! 42! 42!
標籤 :
通過比率 : 4人/5人 ( 80% ) [非即時]
評分方式:
Special

最近更新 : 2022-05-22 18:24

內容

本題為互動題

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
測資資訊:
記憶體限制: 512 MB
公開 測資點#0 (25%): 2.0s , <1K
公開 測資點#1 (25%): 2.0s , <1K
公開 測資點#2 (25%): 2.0s , <1K
公開 測資點#3 (25%): 2.0s , <1K
提示 :

範測為範例程式跑單筆測資$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

標籤:
出處:
[管理者:
giver (垃圾)
]


編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」