题解:P1161 开灯

· · 题解

题目传送门

题意

n 次操作,每次操作给出一个实数 a 和一个整数 t。对于第 i 个操作,我们需要将 a\times i(向下取整)位置的灯的状态进行切换(开变关,关变开)。最后,需要找出最终仍然亮着的灯中编号最小的那个。

分析

我们可以用一个 bool 类型数组 light 来记录每个灯的状态,初始时所有灯都是关闭状态,赋值为 0

对于每个操作,我们需要处理从 1t 的所有 i 值,计算每个 i 对应的灯编号后切换该灯的状态(如果是开就变关,关就变开)。

最后,在所有操作完成后,遍历 light 数组,找到第一个状态为开(赋值为 1)的灯,输出其编号即可。

代码

#include<bits/stdc++.h>
using namespace std;
bool light[2000005];
int main(){
    double a;
    int n,t;

    cin>>n;
    while(n--){
        cin>>a>>t;
        for(int i=1;i<=t;i++){
            int b=a*i;
            if(light[b]==1){
                light[b]=0;
            }else{
                light[b]=1;
            }
        }
    }
    for(int i=1;i<=2000000;i++){
        if(light[i]==1){
            cout<<i;
            break;
        }
    }
    return 0;
}