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
",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
",ans);
return 0;
}