CF83B题解

· · 题解

题目大意:

给你一个有 n 个数的序列,让你重复 k 次操作,每次操作把序列的第 1 个数减一,如果其值大于 0,那么把他放到序列最后面,否则,直接去掉。求最后剩下的数的编号,如果还没执行完 k 次序列就空了,就输出 -1。

思路:

用一个结构体数组来存这 n 个数的值和编号,用 n 来存储个数,然后直接模拟。

Code:

#include <iostream>
using namespace std;
struct bb {
    long long c,d;      // c 用来存储值,d 用来存储编号  
};
bb a[100001];
void aa(int b){             //aa 就是整体往前移一位 
    for (long long i = 1 ; i <= b ; i ++){
        a[i] = a[i + 1];
    }
}
int main(){
    long long n,k,l,l1;     //l 用来存储 a[1]减玩后的值,l1用来存储a[1]的编号 
    cin >> n >> k;
    for (long long i = 1 ; i <= n ; i ++){  //输入 
        cin >> a[i].c;
        a[i].d = i;
    }
    for (long long i = 1 ; i <= k ; i ++){
        if (n == 0){        //判断是否为空,为空直接输出-1 
            cout << -1;
            return 0;
        }
        l = a[1].c - 1;
        l1 = a[1].d;
        if (l == 0){    //如果减完后等于 0,那么去掉 
            n --;
            aa(n);
        }
        else {          //否则,放到最后 
            aa(n-1);
            a[n].c = l;
            a[n].d = l1;
        }
    }
    for (long long i = 1 ; i <= n ; i ++) {     //输出 
        cout << a[i].d << ' ';      
    }
    return 0;
}