ZOJ1622 SWITCH解题报告

Posted on 2010-09-20 09:31 李东亮 阅读(319) 评论(0)  编辑 收藏 引用

 

SWITCH

题目描述如下:

There are N lights in a line. Given the states (on/off) of the lights, your task is to determine at least how many lights should be switched (from on to off, or from off to on), in order to make the lights on and off alternatively.
Input
One line for each testcase.
The integer N (1 <= N <= 10000) comes first and is followed by N integers representing the states of the lights ("1" for on and "0" for off).
Process to the end-of-file.
Output
For each testcase output a line consists of only the least times of switches.
Sample Input
3 1 1 1
3 1 0 1
Sample Output
1
0

分析:该题看似简单但却隐藏着陷阱,题目要求寻找的是最少的切换数,故从第二盏灯开始判断处理得出的结论是不一定正确的。通过分析可以发现该题其实只存在两种情况:奇数位置的灯开着或者偶数位置的灯开着。这样可以直观的处理该题:取奇数位置灯开着需要切换灯状态数与偶数位置灯开着需切换灯状态数的较小值。这样的话需要扫描两边灯的状态数组,开销较大。进一步分析,设a为奇数位置的灯开着需要切换的灯数,b为偶数位置灯开着需要切换的灯数。其实a+b=n。这样本题就只需要扫描一遍数组,且进一步优化后存储灯状态的数组也可以省了。具体代码如下:

 

 1#include <stdio.h>
 2#include <stdlib.h>
 3
 4int main(void)
 5{
 6    int n;
 7    int prev;
 8    int tmp;
 9    int cnt;
10    int a;
11    while (scanf("%d"&n) == 1)
12    {
13        prev = -1;
14        cnt = 0;
15        a = n;
16        while (n--)
17        {
18            scanf("%d"&tmp);
19            if (tmp == prev)
20            {
21                if (tmp == 0)
22                {
23                    prev = 1;
24                }

25                else
26                {
27                    prev = 0;
28                }

29                ++cnt;
30                continue;
31            }

32            prev = tmp;
33        }

34        if (cnt > a/2)
35            cnt = a-cnt;
36        printf("%d\n", cnt);
37    }

38    return 0;
39}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 12, comments - 1, trackbacks - 0, articles - 1

Copyright © 李东亮