Informatică, întrebare adresată de printess199, 8 ani în urmă

3698 tomi
Tomi este primarul ales în orașul Bittown. În oras sunt N locuitori și fiecare are un gard format din exact 60 de scânduri, fiecare dintre ele fiind vopsită în alb sau negru. Fiecare gard este codificat de Tomi printr-un număr natural a cărui reprezentare binară reproduce configurația gardului, de la stânga spre dreapta, scândurile negre fiind asimilate cu bitul 1 iar cele albe cu bitul 0. Astfel, ca exemplu, gardul care are doar ultimele două scânduri vopsite în negru va fi codificat de Tomi cu numărul 3. Tomi decide să-și construiască un gard care să fie reprezentativ pentru Bittown, adică să respecte toate regulile următoare:

1. Gardul primarului Tomi trebuie să aibă exact 60 de scânduri;
2. Trebuie să existe cel puțin K locuitori în Bittown care constată că pentru toate scândurile negre din gardul propriu, scândurile situate pe aceeași poziție în gardul primarului Tomi sunt vopsite tot în negru;
3. Numărul reprezentând codul gardului primarului Tomi trebuie să fie minim posibil.

Date de intrare
Fișierul de intrare tomi.in conține pe prima linie doua numere naturale N și K. Pe cea de-a doua linie se află N numere, reprezentând codurile gardurilor locuitorilor din Bittown.

Date de ieșire
Fișierul de ieșire tomi.out va conține un singur număr reprezentand codul gardului construit de primarul Tomi.

Restricții și precizări
1 ≤ N ≤ 100.000
Fiecare cod este strict mai mic decât 260.
Pentru 19 puncte, toți copiii vor avea doar codurile 1, 2 sau 3.
Pentru alte 38 puncte, codurile copiilor vor mai mici decât 60.



Exemplu
tomi.in

6 3
1 1 5 8 10 8
tomi.out

5
Explicație
Răspunsul este 5 care are configurația în binar 101. Acesta este reprezentativ pentru codurile primelor trei garduri (1 1 5), pentru că le include configurațiile binare, respectând astfel regula 2.


printess199: #3694

Răspunsuri la întrebare

Răspuns de lucaciucandrei
2

#include <bits/stdc++.h>

using namespace std;

int main() {

   vector<int> v;

   int a=(1ll<<60) - 1ll, b, n, nr, k,x;

   ifstream f ("tomi.in");

   ofstream g ("tomi.out");

   f >> n >> k;

   for (int i = 1; i <= n; i++){

       f>>x;

       v.push_back(x);

   }

   for (int i = 59; i >= 0; i--){  

       b = a ^ (1ll<<i);

       nr = 0;

       for (int j = 1; j <= n; j++)

           if ((v[j] | b) == b) nr++;

       if (nr >= k)

           a = b;

   }

   g << a << endl;

   return 0;

}

Alte întrebări interesante