(C++)白準20055コンベア上のロボット


質問と回答


https://www.acmicpc.net/problem/20055
インプリメンテーション
問題条件に従って実施すればよい問題...非常に
  • 移動はどのように表現されていますか?indexに基づいて現在1の位置を設定します.時計回りに移動するため、各ステップのインデックスは1減少します.
  • index<0の場合index=2*N-1
  • index>=2 Nでindex%=(2 N)
  • 降車位置Nは2回確認が必要!!
    1)リードバンド移動前のN番目の位置(前のステップのN番目の位置の場合がある)
    2)リードバンド移動後の第N位置
  • コード#コード#

    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    
    
    int main(){
        ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        
        int N,K;
        cin>>N>>K;
    
        vector<int> belt(N*2+1, 0);
        vector<bool> isRobot(N*2+1, false);
    
        for(int i=0; i<N*2; i++) cin>>belt[i];
    
        int pos=0;
        int level=0;
    
        while(true){
    
            level++;
    
            isRobot[(pos+(N-1))%(N*2)]=false; /// **************
    
            pos--;
            if(pos<0) pos=2*N-1;
            isRobot[(pos+(N-1))%(N*2)]=false;
    
    
            for(int i=N-2; i>0; i--){
                int tmp = (pos+i)%(N*2);
                if(!isRobot[tmp]) continue;
                int next = (tmp+1)%(N*2);
    
                if(belt[next]>0 && !isRobot[next]){
                    isRobot[tmp]=false;
                    isRobot[next]=true;
                    belt[next]--;
                }
            }
    
    
            if(belt[pos]>0) {
                belt[pos]--;
                isRobot[pos]=true;
            }
    
            int cnt=0;
            for(int i=0; i<2*N; i++) {
               // cout<<belt[i]<<" ";
                if(belt[i]<=0) cnt++;
            }
    
            if(cnt>=K) break;
    
        }
    
    
    
        cout<<level;
    
    }