238672026-01-31 10:14:13KristófÓvodacpp17Futási hiba 46/50280ms32000 KiB
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct gyerek
{
int valasztott;
int siras;
int index;
int kapott=-1;
}typedef gyerek;


int main()
{
    set<int> urespoziciok;
    multiset<int> poziciok;
    int n,k;
    cin>>n>>k;
    map<int,int> kiosztottszerepek;
    int x;
    for(int i=1;i<=k;i++)
        {   
        cin>>x;
        urespoziciok.insert(i);
        for(int j=0;j<x;j++)
            {
            poziciok.insert(i);
            }
        }
    vector<gyerek>data(n);
    for(int i=0;i<n;i++)
        {
        data[i].index=i;
        cin>>data[i].valasztott;
        }
    for(int i=0;i<n;i++)
        {
        cin>>data[i].siras;
        }


    //sort
    sort(data.begin(),data.end(),[](gyerek a,gyerek b)
         {
         if(a.siras>b.siras)
            {
            return true;
            }
         return false;
         });

    //aki tudja megkapja a vagyat
    for(int i=0;i<n;i++)
        {
        if(poziciok.find(data[i].valasztott)!=poziciok.end())
            {
            if(urespoziciok.find(data[i].valasztott) != urespoziciok.end())
                urespoziciok.erase(urespoziciok.find(data[i].valasztott));
            poziciok.erase(poziciok.find(data[i].valasztott));
            data[i].kapott=data[i].valasztott;
            kiosztottszerepek[data[i].kapott]++;
            }
        }
    //mindenki kapjon valamit ha a valasztottja nem elérhető
    for(int i=0;i<n;i++)
        {
        if(data[i].kapott != -1)
            continue;
        if(urespoziciok.size())
            {
            data[i].kapott=*urespoziciok.begin();
            kiosztottszerepek[data[i].kapott]++;
            poziciok.erase(poziciok.find(data[i].kapott));
            urespoziciok.erase(urespoziciok.begin());
            
            }
        else
            {
            data[i].kapott=*poziciok.begin();
            kiosztottszerepek[data[i].kapott]++;
            poziciok.erase(poziciok.begin());
            }
        }
    //urespoziciok feltoltese
    int i=n-1;
    while(urespoziciok.size()!=0 && i>=0)
        {
        if(kiosztottszerepek[data[i].kapott] > 1)
            {
            kiosztottszerepek[data[i].kapott]--;
            poziciok.insert(data[i].kapott);
            data[i].kapott=*urespoziciok.begin();
            urespoziciok.erase(urespoziciok.begin());
            
            }
        i--;
        }
     i=n-1;
    //biztonsag
    while(i>=0)
        {
        if(-1 == data[i].kapott)
            {
            data[i].kapott=*poziciok.begin();
            poziciok.erase(poziciok.begin());
            }
        i--;
        }
    int ssiras=0;
    for(auto x : data)
        {
        if(x.kapott != x.valasztott)
            {
            ssiras+=x.siras;
            }
        }
    vector<int> ans(n);

    for(auto x : data)
        {
        ans[x.index]=x.kapott;
        }
    cout<<ssiras<<"\n";
    for(auto x : ans)
        {
        cout<<x<<" ";
        }
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base46/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/010ms1076 KiB
3Elfogadva2/22ms316 KiB
4Elfogadva2/21ms316 KiB
5Elfogadva2/21ms316 KiB
6Elfogadva2/21ms316 KiB
7Elfogadva2/21ms316 KiB
8Elfogadva2/21ms316 KiB
9Elfogadva2/21ms500 KiB
10Elfogadva2/21ms316 KiB
11Elfogadva2/21ms316 KiB
12Elfogadva2/21ms316 KiB
13Elfogadva2/23ms316 KiB
14Elfogadva3/32ms316 KiB
15Elfogadva3/327ms1852 KiB
16Elfogadva3/364ms3412 KiB
17Elfogadva3/3100ms7108 KiB
18Elfogadva3/3280ms20648 KiB
19Elfogadva3/3166ms9012 KiB
20Elfogadva3/3136ms7220 KiB
21Elfogadva3/3224ms10288 KiB
22Futási hiba0/4158ms32000 KiB