题解:P1161 开灯

· · 题解

tyj.ac

题面分析:

有无限盏灯排成一行,每次将 t[i] 盏灯的开关按下。问 n 次操作后唯一开着的灯的编号。

由于数据范围不大,因此对于每次操作可以直接模拟被改变状态的灯,开则关,关则开。最后,从 1 开始依次遍历,直至找到第一盏开着的灯为止并输出。

样例解释:

第一次操作将:1,3,4,6,8,9,11,12,14,16,17,19,21 号灯状态改变。

第二次操作将:2,5,7,10,13,15,18 号灯状态改变。

第三次操作将:1,2,3,4,5,6,7,8,\cdots,19,20,21 号灯状态改变。

由此得出,离小明最近的一盏亮着的灯的编号为 20

AC CODE:

#include<bits/stdc++.h>
using namespace std;
int n,s[2000005];
double a,t;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a>>t;//改变t盏灯的状态。
        for(int j=1;j<=t;++j){
            s[int(j*a)]=(s[int(j*a)]+1)%2;//更新为按下开关后的状态。
        }
    }for(int i=1;i<=2000000;i++){
        if(s[i]){
            cout<<i;//最近的一个亮着的灯。
            return 0;
        }
    }
    return 0;//好习惯!
}

有疑问私信沟通哦!