55272023-07-05 00:28:35AndrosGladiátorok (40 pont)cpp17Hibás válasz 14/4076ms15700 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <unordered_map>
#define ll long long
using namespace std;
//upper_bound() a normal akadalyok vecen
//csak megtanultam hogyan lehet upper_bound()-ot hivni egy vector<pair<>> -on


//Magyarazattal
int main()
{
	//ifstream cin;
	//cin.open("be2.txt");
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	//Hiba=>Mindenhol long long
	ll szendb, caedb;
	cin >> szendb >> caedb;
	//Beolvasas, a szenatorok parokba lesznek beolvasva.
	vector<pair<ll, ll>> szenator(szendb);
	for (ll i = 0; i < szendb; i++)
	{
		cin >> szenator[i].first >> szenator[i].second;
	}

	vector<ll> caesar(caedb);
	for (ll i = 0; i < caedb; i++)
	{
		cin >> caesar[i];
	}

	//A szortirozas az elso par szerint szortiroz.
	//Azzal mindenkepp max pontot erunk el, ha a leggyengebbek lesznek elol.
	sort(szenator.begin(), szenator.end());



	vector<ll> hozott_ero(szendb);//az ero, amit az eddig legyozott gladiatorokbol szerzunk.
	ll sum = 0;

	vector<ll> kello_ero(szendb);//Az ero ami az elejetol kell, hogy legyozzuk

	//Otlet: Ha a kello_ero={5, 2, 8}
	//akkor a 2-esen senki se fog elbukni. Mert mar atment az 5-oson.
	vector<pair<ll,ll>> akadalyok;
	ll max = 0;
	for (ll i = 0; i < szendb; i++)
	{
		//Messy a ciklus, mert egybevontam harmat. 
		
		//Hozott ero kiszamitasa
		hozott_ero[i] = sum;
		//ebbol a kello ero kiszamitasa
		kello_ero[i] = szenator[i].first - hozott_ero[i];

		//hozott eronek a sum szamolasa
		sum += szenator[i].second;
		
		if (kello_ero[i] > max) {//Ha uj legnagyobb "akadaly" van
			max = kello_ero[i];
			akadalyok.push_back({kello_ero[i], i});//lementem az indexre
		}
	}

	//A vegen elkapjuk a legerosebbet egy nagyon nagy szammal
	// 
	//long long limit     9223372036854775807
	akadalyok.push_back({ 9223372036854775807, szendb });
	//akadalyok.push_back({ 10000000000000000000, szendb });
	//^ez hibat dob, de VS nem jelzi ki hogy nagyobb, mint az ll limit^
	//^              de eggyel tobb 0-val kijelzi   

	cout << endl;
	for (ll glad : caesar) {
		//megkeresi az elso gladiatort, ami legyozi ot
		//elozo probalkozasban nem ment az upper_bound, mert nem volt rendezve a tomb
		//mostmar rendezve van
		auto it = upper_bound(akadalyok.begin(), akadalyok.end(), pair<ll, ll>{ glad, 0 });//igy lehet meghivni, masodik erteknek vannak szabalyai, cppreference segit
		cout << it->second <<" ";
	}

}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base14/40
1Elfogadva0/03ms1704 KiB
2Elfogadva0/016ms4544 KiB
3Elfogadva2/23ms2164 KiB
4Elfogadva2/23ms2464 KiB
5Elfogadva2/24ms3004 KiB
6Hibás válasz0/24ms3244 KiB
7Elfogadva2/24ms3460 KiB
8Hibás válasz0/24ms3628 KiB
9Elfogadva2/24ms3720 KiB
10Elfogadva2/24ms3720 KiB
11Hibás válasz0/213ms6076 KiB
12Hibás válasz0/256ms14756 KiB
13Hibás válasz0/250ms10128 KiB
14Hibás válasz0/276ms15560 KiB
15Hibás válasz0/275ms15592 KiB
16Hibás válasz0/275ms15592 KiB
17Hibás válasz0/275ms15700 KiB
18Hibás válasz0/252ms11500 KiB
19Hibás válasz0/252ms11500 KiB
20Elfogadva2/252ms11504 KiB
21Hibás válasz0/257ms11512 KiB
22Hibás válasz0/257ms11640 KiB