Omówienie zadania „Lampy”

Omówienie zadania „Lampy” z Wrocławskich Sparingów Informatycznych:
https://youtu.be/OafWtKkbGmw?t=6498
oraz omówienie tego zadania na zajęciach Wrocławskich Sparingów Informatycznych:
https://youtu.be/uBK5xeP5voA
#include<bits/stdc++.h>
using namespace std;
bool StanLampy[1000010]; // 0-zgaszona  1-zapalona
int main()
{
    int n,MinZapalonych=0,AktZapalonych,i=1;
    //wczytuje dane :
    char lampa;
    while((lampa=getchar())!='\n'){
        if(lampa=='#')     //lampa jest  zapalona
            StanLampy[i]=1;
        else               // lampa jest zgaszona
            StanLampy[i]=0;

        MinZapalonych+=StanLampy[i];
        i++;
    }
    n=i-1; // n-liczba lamp

    //wciskamy tylko przycisk 1:
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(i%2==0)
            AktZapalonych+=!StanLampy[i]; //  dla niewtajemniczonych ! to symbol negacji
        else                              // !0=1  !1=0  -odpowiada to zmianie stanu lampy
            AktZapalonych+=StanLampy[i];  //  o numerze parzystym na stan przeciwny
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy tylko przycisk 2:
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(i%2)
            AktZapalonych+=!StanLampy[i];
        else
            AktZapalonych+=StanLampy[i];
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy tylko przycisk 3:
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(i%3==0)
            AktZapalonych+=!StanLampy[i];
        else
            AktZapalonych+=StanLampy[i];
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy przyciski 1 i 2:
    AktZapalonych=0;
    for(i=1;i<=n;i++)
        AktZapalonych+=!StanLampy[i]; //wciśnięcie przycisku 1 i 2 jest równoważne zmianie stanu wszystkich lamp
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy przyciski 1 i 3:
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(((i%2==0)&&(i%3))||((i%2)&&(i%3==0))) // jeżeli lampa ma numer podzielny przez 2, ale niepodzielny przez 3
             AktZapalonych+=!StanLampy[i];          // lub niepodzielny przez 2, ale podzielny przez 3, to zmienia swój stan
        else
            AktZapalonych+=StanLampy[i];
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy przyciski 2 i 3:
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(((i%2)&&(i%3))||((!(i%2))&&(!(i%3)))) // jeżeli lampa ma numer niepodzielny przez 2 i niepodzielny przez 3
             AktZapalonych+=!StanLampy[i];             // lub podzielny przez 2, i podzielny przez 3, to zmienia swój stan
        else
             AktZapalonych+=StanLampy[i];
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);

    //wciskamy wszystkie przyciski
    AktZapalonych=0;
    for(i=1;i<=n;i++){
        if(i%3==0)
            AktZapalonych+=StanLampy[i];               // wciskając przyciski 2 i 3 odwracamy stany wszystkich lamp
        else                                          // wtedy przycisk 3 zmienia stan lamp o numerach podzielnych
            AktZapalonych+=!StanLampy[i];              // przez 3 na początkowy
    }
    MinZapalonych=min(MinZapalonych,AktZapalonych);
    cout<<MinZapalonych<<"\n";
}

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz