1. 程式人生 > >zzuli:小G的日常之開關燈

zzuli:小G的日常之開關燈

http://acm.zzuli.edu.cn/problem.php?id=2391

題目描述

在小G面前有一排燈,有的燈是亮的有的燈是滅的,假如小G按了一個燈的開關,那麼這個燈和它後面的都會變成相反的狀態,既滅的亮,亮的滅.
現在小G想把所有的燈開啟,請問最少需要按多少個開關?

 

輸入

第一行輸入一個數n(n<=1000),表示有n盞燈
第二行輸入n個數,表示n盞燈的當前狀態,0表示燈滅,1表示燈亮

 

輸出

最少的運算元是多少。

 

樣例輸入

5
0 0 0 0 0

 

樣例輸出

1

因為每個關著的燈都必須操作一次,所以只要從前到後模擬一遍就行了。

#include<stdio.h>
#define N 1020
int a[N];
int main()
{
	int n,i,j,ans=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
	{
		if(a[i]==0)
		{
			ans++;
			for(j=i;j<=n;j++)
				a[j]=!a[j];
		}
	}
	printf("%d\n",ans);
	return 0;
}

還可以簡化成一次迴圈,記錄開燈的次數,後面的燈當開燈次數為偶數的時候不用改變,如果為奇數,狀態改變。

#include<stdio.h>
#define N 1020
int a[N];
int main()
{
	int n,i,j,ans=0,s=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
	{
		if((s%2))
		a[i]=!a[i];
		if(a[i]==0)
		{
			ans++;
			s++; 
		}
	}
	printf("%d\n",ans);
	return 0;
}