94572024-02-21 21:32:22AblablablaÓvodacpp11Hibás válasz 8/50131ms18300 KiB
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int main(){
	int n, m;
    cin >> n >> m;


	vector<int> max_ember(m); // hany ember jatszhat egy szerepet
	for(auto &x : max_ember){
		cin >> x;
	}

	vector<int> valasztotta(n); // ki mit valasztott
	for(auto &x : valasztotta){
		cin >> x;
		x--;
	}

	vector<int> sir(n); // ki mennyit sir
	for(auto &x : sir){
		cin >> x;
	}
	// beolvasás vége
	//cout << "beolvas veg\n";

	vector<vector<int>> akar(m, vector<int>()); // melyik szerepet kik akarják
	for(int i = 0; i < n; i++){
		akar[valasztotta[i]].push_back(i);
	}

	//cout << "1\n";

	// elorebb kell-e legyen a, mint b?
	auto akar_ember_rendezo_comp = [&](int a, int b){
		return sir[a] < sir[b];
	};
	// !! PRIORITY_QUEUE-nál ez pont fordítva van


	vector<int> aktDb(m);
	for(int i = 0; i < m; i++){
		sort(akar[i].begin(), akar[i].end(), akar_ember_rendezo_comp);

		aktDb[i] = akar[i].size();
	}

	//cout << "1\n";

	vector<int> index(m);
	for(int i = 0; i < m; i++){
		index[i] = i;
	}

	//cout << "1\n";

	auto index_rend = [&](int a, int b){

		if(akar[a].size() == 0 && akar[b].size()){
			return false;
		} else if(akar[b].size() == 0 && akar[a].size()){
			return true;
		} else if(akar[a].size() == 0 && akar[b].size() == 0){
		    return a < b;
		}

		return max_ember[a] - akar[a].size() < max_ember[b] - akar[b].size();
	};

	sort(index.begin(), index.end(), index_rend);

	//cout << "1\n";
	int tesz = m - 1;
	int vesz = 0;
	vector<int> vegso(n, -1);
	vector<int> elsok(m);

	vector<int> nem_egyedul; // nem egyedul levo emberek indexei, akik atrakhatoak
	for(int i = 0; i < n; i++){
		if(akar[valasztotta[i]].size() > 1){
			nem_egyedul.push_back(i);
		}
	}

	//cout << "1\n";

	auto nem_egyedul_rend = [&](int c, int d){
		int a = valasztotta[c];
		int b = valasztotta[d];
		if(max_ember[a] < aktDb[a] && max_ember[b] < aktDb[b]){
			return sir[c] < sir[d];
		} else if(max_ember[a] < aktDb[a]){
			return true;
		} else if(max_ember[b] < aktDb[b]){
			return false;
		}

		return sir[c] < sir[d];
	};

	sort(nem_egyedul.begin(), nem_egyedul.end(), nem_egyedul_rend);
	int ind = 0;

	for(int i = m - 1; i >= 0 && aktDb[index[i]] == 0; i--){
		/*if(aktDb[index[i]] != 0){
			continue;
		}*/

		aktDb[index[valasztotta[nem_egyedul[ind]]]]--;
		aktDb[index[i]]++;
		vegso[nem_egyedul[ind]] = index[i];
		elsok[index[valasztotta[nem_egyedul[ind]]]]++;
		ind++;
	}

	//cout << "nulla veg\n";

	//sort(index.begin(), index.end(), index_rend);
	while(max_ember[index[vesz]] - akar[index[vesz]].size() < 0){ // van meg olyan hely ahol tobben vannak mint kene
		while(max_ember[index[vesz]] - aktDb[index[vesz]] < 0){ // ez a hely meg olyan
			while(max_ember[index[tesz]] - aktDb[index[tesz]] <= 0){ // olyan helyre pakolunk ahova meg lehetseges
				tesz--;
			}

			if(vegso[akar[index[vesz]][elsok[index[vesz]]]] == -1){
				vegso[akar[index[vesz]][elsok[index[vesz]]]] = index[tesz];
				aktDb[index[vesz]]--;
				aktDb[index[tesz]]++;
				elsok[index[vesz]]++;
			} else{
				elsok[index[vesz]]++;
			}
		}

		vesz++;
	}

	int valasz = 0;
	for(int i = 0; i < n; i++){
        if(vegso[i] != -1){
            valasz += sir[i];
        }
	}
	cout << valasz << "\n";
	for(int i = 0; i < n; i++){
		if(vegso[i] != -1){
			cout << vegso[i] + 1 << " ";
		} else{
			cout << valasztotta[i] + 1 << " ";
		}
	}


	// 1. rendezed a túlfolyásokat (mindenképpen lehetséges)
	// 		1.1 szerepeket berendezi plusz emberek alapján csökkenõbe
	//		1.2 elsõbõl pakolássza az utolsóba a legkevésbé sírósakat
	// 2. feltölti a helyeket, ahol nincs ember legkevésbé síró és nem egyedül lévõ emberekkel


}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base8/50
1Elfogadva0/03ms1680 KiB
2Hibás válasz0/07ms2308 KiB
3Hibás válasz0/23ms2336 KiB
4Elfogadva2/23ms2412 KiB
5Hibás válasz0/22ms2496 KiB
6Elfogadva2/23ms2740 KiB
7Hibás válasz0/23ms2984 KiB
8Hibás válasz0/22ms3000 KiB
9Elfogadva2/23ms3032 KiB
10Elfogadva2/23ms3116 KiB
11Hibás válasz0/23ms3192 KiB
12Hibás válasz0/23ms3188 KiB
13Hibás válasz0/23ms3396 KiB
14Hibás válasz0/33ms3224 KiB
15Hibás válasz0/314ms4620 KiB
16Hibás válasz0/332ms7120 KiB
17Hibás válasz0/343ms6108 KiB
18Hibás válasz0/374ms11144 KiB
19Hibás válasz0/379ms8144 KiB
20Hibás válasz0/387ms8156 KiB
21Hibás válasz0/3101ms9868 KiB
22Hibás válasz0/4131ms18300 KiB