CF83B---Docter的题解

· · 题解

题意

这题很容易理解,就是给你 n 个数,让他们循环 k 次操作。

思路

我认为这道题可以用队列做。

它给你 n 个数,让你每次拿出他的第一个数,

然后判断这个数减 1 后是否大于 0;

如果大的话,将这个数减 1 然后放到这 n 个数的最后面;

在进行 k 次操作后输出剩下说有数的下标。

(这个下标是输入这 n 个数是这 n 个数分别的下标,并且下标会跟随数进行移动。)

否则就不管这个数(不把它加到队尾)。

如果在 k 次操作中所有数都没了的话,就跳出操作,输出 -1。

接下来上代码

#include<bits/stdc++.h>
using namespace std;

int n,k;

int main(){
    cin>>n>>k;
    queue <long long> q;    //储存数的队列
    queue <long long> xb;   //储存下标的队列
    for(int i=0;i<n;i++){   //输入 n 个数并储存他们的下标
        int a;
        cin>>a;
        q.push(a);
        xb.push(i+1);
    }
    for(int i=0;i<k;i++){   // k 次操作
        if(q.empty()==1){   //如果在操作中所有数都没了的话,就跳出操作,输出$-1$
            cout<<"-1"<<endl;
            return 0;
        }
        int a=q.front()-1,b=xb.front();
        q.pop();xb.pop();
        if(a>0){            //判断这个数在操作后是否大于 0
            q.push(a);
            xb.push(b);     //把数和下标放到各自的队列尾
        }
    }
    while(!xb.empty()){
        cout<<xb.front()<<" ";      //输出队列
        xb.pop();
    }
    cout<<endl;
    return 0;
}