234 2021. 03. 05 12:01:32 Kevinke12 Óvoda cpp14 Hibás válasz 33/50 497ms 9320 KiB
#include <iostream>
#include <algorithm>
using namespace std;

int N, M;
int szerep[100005];
int eljatszak[100005]; //hanyan jatszak az adot szerepet
int kime[100005]; //ki melyiket kapja

struct adat
{
    int ind;
    int aksz;
    int sir;
};
bool Rend(adat a, adat b)
{
    return ((a.sir>b.sir) || ((a.sir==b.sir) && (szerep[a.aksz]<szerep[b.aksz])));
}
adat t[100005];

int KoviSzerep() //megadja a kovetkezo szerepeket
{
    for(int i = 1; i <= M; i++)
    {
        if(eljatszak[i]==0)
            return i;
    }
    //már mindenen szerepet játszanak -> kell pár még az embereknek
    for(int i = 1; i <= M; i++)
    {
        if(eljatszak[i]<szerep[i]) //még van hely rá
            return i;
    }
}

int main()
{
    cin >> N >> M;
    for(int i = 1; i <= M; i++)
    {
        cin >> szerep[i];
    }
    for(int i = 1; i <= N; i++)
    {
        t[i].ind=i;
        cin >> t[i].aksz;
    }
    for(int i = 1; i <= N; i++)
    {
        cin >> t[i].sir;
    }
    //Rendezünk
    sort(t+1, t+N+1, Rend);

    int ans=0;
    //Mohó vagyok
    //Mindekinek a kedvére teszek
    for(int i = 1; i <= N; i++)
    {
        if(eljatszak[t[i].aksz] < szerep[t[i].aksz])
        {
            kime[t[i].ind] = t[i].aksz;
            eljatszak[t[i].aksz]++;
        }
        else
            ans+=t[i].sir;
    }

    //most vannak, akik sírnak, töltöm az üres szerepeket
    int almafa=0;
    for(int i = 1; i <= N; i++)
    {
        if(kime[i]==0)//adunk neki szerepet
        {
            almafa = KoviSzerep();
            kime[i] = almafa;
            eljatszak[kime[i]]++;
        }
    }
    //van e szerep, amit nem jatszik el senki sem
    for(int j = 1; j <= M; j++)
    {
        if(eljatszak[j]==0) //senki eddig
        {
            for(int i = N; i >= 1; i--)
            {
                if(eljatszak[szerep[t[i].ind]]>1)//van rajta kivul mas
                {
                    ans+=t[i].sir;
                    kime[t[i].ind] = j;
                    eljatszak[szerep[t[i].ind]]--;
                    eljatszak[j]++;
                    break;
                }
            }
        }
    }
    cout << ans << "\n";
    for(int i = 1; i <= N; i++)
    {
        cout << kime[i] << " ";
    }
    cout << "\n";
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 33/50
1 Elfogadva 0/0 2ms 1816 KiB
2 Elfogadva 0/0 6ms 2068 KiB
3 Elfogadva 2/2 1ms 1960 KiB
4 Elfogadva 2/2 1ms 1964 KiB
5 Elfogadva 2/2 1ms 1968 KiB
6 Elfogadva 2/2 1ms 1976 KiB
7 Hibás válasz 0/2 1ms 1984 KiB
8 Elfogadva 2/2 1ms 1980 KiB
9 Elfogadva 2/2 1ms 1984 KiB
10 Elfogadva 2/2 1ms 1992 KiB
11 Elfogadva 2/2 1ms 1996 KiB
12 Elfogadva 2/2 1ms 1996 KiB
13 Hibás válasz 0/2 2ms 2020 KiB
14 Elfogadva 3/3 2ms 2032 KiB
15 Hibás válasz 0/3 14ms 2652 KiB
16 Hibás válasz 0/3 107ms 3652 KiB
17 Elfogadva 3/3 39ms 4344 KiB
18 Időlimit túllépés 0/3 486ms 4012 KiB
19 Elfogadva 3/3 85ms 6996 KiB
20 Elfogadva 3/3 82ms 8240 KiB
21 Elfogadva 3/3 186ms 9320 KiB
22 Időlimit túllépés 0/4 497ms 7332 KiB