『题解』CodeForces CF120B Quiz League
题目大意
给定 \(n\) 个值为 \(0\) 或 \(1\) 的数围成一个环,第一个数的位置是 \(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;
}

浙公网安备 33010602011771号