fbpx

Problema #3400 – culori5 – Rezolvari PBInfo

de Mihai-Alexandru

În jurul muzeului din orașul Smallville exista un gard ce conține N scânduri de înălțimi diferite. Putem spune că scândura i are înălțimea Hi. Directorul muzeului le-a cerut angajaților să vopsească acest gard cu un număr minim de culori, astfel încât să se respecte următoarea condiție: pentru un număr întreg K cunoscut, orice secvență de K scânduri consecutive nu trebuie să conțină două scânduri de aceeași înălțime, colorate identic.

Cerința

Scrieţi un program care să găsească numărul minim de culori ce vor fi folosite pentru a colora gardul.

Date de intrare

Fișierul de intrare culori.in conține pe prima linie N K – două numere întregi reprezentând numărul de scânduri și lungimea secvenței. Pe următoarea linie, N numere naturale Hi reprezentand înălțimile celor N scânduri.

Date de ieșire

Fișierul de ieșire culori.out va conține un număr întreg C reprezentând numărul minim de culori folosite.

Restricții și precizări

  • 1 ≤ K ≤ 200.000
  • 1 ≤ K ≤ N ≤ 1.000.000
  • 1 ≤ Hi ≤ 1.000
  • Pentru 50% din punctaj, 1 ≤ K ≤ N ≤ 5.000
  • Pentru 80% din punctaj, 1 ≤ K ≤ N ≤ 200.000

Exemplu

culori.in

6 4
1 1 2 1 3 2

culori.out

3

Explicație

O posibilă colorare a scândurilor folosind culorile 1, 2, 3 este: 1 2 1 3 1 2.
Există 3 secvențe: 1 1 2 1, 1 2 1 3 și 2 1 3 2 și orice secvență respectă condiția din enunț.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("culori.in");
ofstream cout("culori.out");

int f[2001], maxi = 0;
int a[1000001];

int main(){
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    for(int i = 1; i <= k; ++i)
        f[a[i]] ++, maxi = max(maxi, f[a[i]]);
    for(int i = k + 1; i <= n; ++i){
        f[a[i - k]] --;
        f[a[i]]++;
        maxi = max(maxi, f[a[i]]);
    }
    cout << maxi;
    return 0;
}
Comentarii

S-ar putea sa iti placa