2342021-03-05 12:01:32Kevinke12Óvodacpp14Hibás válasz 33/50497ms9320 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ÖsszpontTesztVerdiktIdőMemória
base33/50
1Elfogadva0/02ms1816 KiB
2Elfogadva0/06ms2068 KiB
3Elfogadva2/21ms1960 KiB
4Elfogadva2/21ms1964 KiB
5Elfogadva2/21ms1968 KiB
6Elfogadva2/21ms1976 KiB
7Hibás válasz0/21ms1984 KiB
8Elfogadva2/21ms1980 KiB
9Elfogadva2/21ms1984 KiB
10Elfogadva2/21ms1992 KiB
11Elfogadva2/21ms1996 KiB
12Elfogadva2/21ms1996 KiB
13Hibás válasz0/22ms2020 KiB
14Elfogadva3/32ms2032 KiB
15Hibás válasz0/314ms2652 KiB
16Hibás válasz0/3107ms3652 KiB
17Elfogadva3/339ms4344 KiB
18Időlimit túllépés0/3486ms4012 KiB
19Elfogadva3/385ms6996 KiB
20Elfogadva3/382ms8240 KiB
21Elfogadva3/3186ms9320 KiB
22Időlimit túllépés0/4497ms7332 KiB