任性的阿三 sdut 3528

本文介绍了一个有趣的算法问题:如何通过最少的操作次数将一排灯泡全部关闭,其中包含坏掉的灯泡。提供了完整的代码实现及解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

阿三出门游玩,遇到了一排任性的灯泡,这一排灯泡有亮有暗,而且有两个连续的灯泡坏掉了。

阿三是一个环保主义者,他希望把所有的灯泡关掉之后再离开.
除了端点的灯泡,每个灯泡都有唯一的一个开关,并且如果摁下pos位置上灯泡的开关,pos、pos-1和pos+1位置上的灯泡都会取反(即亮变暗、暗变亮)
问题是最少需要按下多少次开关,把所有的灯泡关掉.
保证两边端点的灯泡没有开关,并且都是暗的。
(来自出题人善意的提醒:坏掉的灯泡的开关并没有坏,按下之后边上灯也会受到控制(如果边上的灯没坏的话))

Input

每组输入数据占一行是给定的01字符串,0代表暗,1代表亮,x代表坏掉了。
长度 < 1000;
保证输入的数据一定有两个连续的x

Output

  输出格式占一行,输出最少操作数。

Example Input
01110xx110
0111001xx
Example Output
2
2
Hint
Author

 2015级《程序设计基础II》计科软件通信期末上机考试2

#include<bits/stdc++.h>
using namespace std;
char s[1005];
int a[1005];
int main()
{
    while(~scanf("%s",s))
    {
        memset(a,0,sizeof(a));
        int len=strlen(s);
        int i=0;
        while(s[i]!='x')
        {
            if(s[i]=='1')
            {
                a[i+1]=1;
                s[i]='0';
                if(s[i+1]=='0')
                    s[i+1]='1';
                else if(s[i+1]=='1')
                    s[i+1]='0';
                if(s[i+2]=='0')
                    s[i+2]='1';
                else if(s[i+2]=='1')
                    s[i+2]='0';
            }
            i++;
        }
        i=len-1;
        while(s[i]!='x')
        {
            if(s[i]=='1')
            {
                a[i-1]=1;
                s[i]='0';
                if(s[i-1]=='0')
                    s[i-1]='1';
                else if(s[i-1]=='1')
                    s[i-1]='0';
                if(s[i-2]=='1')
                    s[i-2]='0';
                else if(s[i-2]=='0')
                    s[i-2]='1';
            }
            i--;
        }
        /*for(i=0;i<=len-1;i++)
        {
            printf("%d ",a[i]);
        }*/
        int count=0;
        for(i=0; i<=len-1; i++)
        {
            if(a[i]==1) count++;
        }
        printf("%d\n",count);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值