0081-開關燈
阿新 • • 發佈:2018-11-03
題目
開關燈 |
難度級別:A; 執行時間限制:1000ms; 執行空間限制:256000KB; 程式碼長度限制:2000000B |
試題描述 |
禮堂有n盞燈(n<=5000),從1到n按順序對燈進行編號,初始時全部處於開啟狀態;有m個人(m<=1000)也從1到m依次編號。 第一個人(1號)將燈全部關閉,第二個人(2號)將編號為2的倍數的燈開啟,第三個人(3號)將編號為3的倍數的燈做了相反處理(即開啟的燈關閉,將關閉的燈開啟)。依照編號遞增順序,以後的人都和3號一樣,將自己編號倍數的燈做相反處理。 經過m個人操作最後有多少燈是開著的?輸出開著燈的個數。 |
輸入 |
一行兩個整數n和m |
輸出 |
輸出開著的燈的數量。 |
輸入示例 |
4 3 |
輸出示例 |
3 |
分析
此題仔細分析便能發現只要能用兩層迴圈一層迴圈人數,一層迴圈燈數,再判斷是否整除就行了。
同時,直接通過bool型別陣列(開啟為1,關閉為0)可以很清晰地儲存燈的狀態。想要實現開的關,關的開,直接用1減去當前燈的狀態就行了(開啟為1,1-1=0,關閉為0,1-0=1)。
程式碼
#include<bits/stdc++.h> using namespace std; bool a[5005]; int n,m,ans; int main() { scanf("%d%d",&n,&m); memset(a,1,sizeof(a));//初始時全部處於開啟狀態 for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(!(j%i))/*按照題目要求開啟或關閉對應的燈。*/ a[j]=1-a[j];//用1減去當前的數,就能夠實現開啟的關閉,關閉的開啟。 for(int i=1;i<=n;i++) if(a[i]) ans++;//統計開著的燈。 printf("%d",ans); return 0; }