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
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";
}
