『题解』CodeForces CF120B Quiz League

· · 题解

题目传送门

题目大意

给定 n 个值为 01 的数围成一个环,第一个数的位置是 1。给定一个数 k,求从第 k 个数开始顺时针遍历整个环,第一个遇到的 1 的位置。

思路

模拟即可。

也不需要用什么队列,不用什么 % 运算,咱直接将原数组复制一遍到后面接着,然后从第 k 个数开始判断,碰到一个 1 输出就行了。

比较玄学的是,这题还要文件输入输出...所以要加上两句:

freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);

代码

#include <iostream>
using namespace std;
int n,k,a[2005]; // 由于要复制数组,所以开两倍空间

int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout); // 文件输入输出
    cin >> n >> k;
    for(int i=1; i<=n; i++){
        cin >> a[i];
        a[i+n]=a[i]; // 一边输入一边复制
    }
    while(!a[k++]); // 找第一个 1
    cout << (k-2)%n+1 << endl;
    // 找到 1 之后 k 会多一位,然后由于下标从 1 开始又多了
    // 所以要 (k-1)%n
    // (k-1)%n 之后的范围又在 [0,n-1],所以要加一,变成[1,n]。
    return 0;
}