8342022-01-20 09:41:00AbbenceTalálkozáscpp11Időlimit túllépés 46/55298ms14408 KiB
#include <iostream>
#include <fstream>
#include <stdlib.h>

#define MAXIDO 100000
#define be cin // cin | beFajl

using namespace std;

struct elem{
    int kezd = -1;
    int veg = -1;
    elem* kov = NULL;
};

struct intervallum{
    int kezd;
    int veg;
    int hossz;
};

int comp(const void* a, const void* b)
{
    return (*(elem**)a)->veg - (*(elem**)b)->veg;
}

elem* minTomb[MAXIDO];

int main()
{
    ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

    ifstream beFajl;
    beFajl.open("be2.txt");
    int n;
    be >> n;
    int fele = (n%2 == 0 ? n/2 : n/2+1);

    elem* vendegek = new elem;
    elem* li = vendegek;

    for(int i=0; i<n; i++){
        minTomb[i] = li;
//        cerr << li << endl;
        be >> li->kezd >> li->veg;
        li->kov = new elem;
        li = li->kov;
    }
    beFajl.close();

    qsort(minTomb,n,sizeof(elem*),comp);

    li = vendegek;
    intervallum ans; // megoldások
    ans.kezd = MAXIDO;
    ans.veg = 0;
    for(int j = 0; j<fele; j++){ // elsõ n/2 ember vizsgálata
        if(li->veg < ans.kezd){
            ans.kezd = li->veg;
        }
        if(li->kezd > ans.veg){
            ans.veg = li->kezd;
        }
        li = li->kov;
    }
    ans.hossz = ans.veg - ans.kezd + 1;

    int minVeg = ans.kezd; // min kereséssel kapjuk meg
    int maxKezd = ans.veg; // max kereséssel kajuk meg, minVeg <= maxKezd
    int k=1; // k=0 --> k=1 (mert a legkisebb elemet már megkaptuk az első n/2 ember vizsgálatával!!)
    elem* lj;
    do{
        lj = vendegek;
        if(lj->veg != minVeg){
            while((lj->kov)->veg != minVeg){ // egyenlő távozású emberek közül lényegtelen, hogy melyiket töröljük
                lj = lj->kov;
            }
            lj->kov = (lj->kov)->kov;
        }
        else{ // 1. elem lekezelése
            vendegek = lj->kov;
        }

        minVeg = minTomb[k++]->veg; // min beálltása a minTomb köv eleméből

        maxKezd = li->kezd; // max beállítása

        if(maxKezd <= minVeg){
            ans.hossz = 1;
            ans.kezd = maxKezd;
            ans.veg = ans.kezd;
        }
        else if(maxKezd - minVeg + 1 < ans.hossz){
            ans.kezd = minVeg;
            ans.veg = maxKezd;
            ans.hossz = ans.veg - ans.kezd + 1;
        }
        li = li->kov;
    }while(li->kov);

    cout << ans.hossz << endl << ans.kezd << " " << ans.veg << endl;

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base46/55
1Elfogadva0/02ms1764 KiB
2Időlimit túllépés0/0287ms6444 KiB
3Részben helyes1/21ms3020 KiB
4Elfogadva2/21ms3028 KiB
5Elfogadva2/21ms3024 KiB
6Elfogadva2/21ms3040 KiB
7Elfogadva2/21ms3048 KiB
8Elfogadva3/31ms3036 KiB
9Elfogadva3/31ms3048 KiB
10Elfogadva3/31ms3060 KiB
11Elfogadva3/34ms3564 KiB
12Elfogadva3/34ms4028 KiB
13Elfogadva3/34ms4136 KiB
14Elfogadva3/38ms5068 KiB
15Elfogadva3/38ms5268 KiB
16Elfogadva3/38ms5324 KiB
17Elfogadva3/38ms5596 KiB
18Elfogadva3/318ms6996 KiB
19Részben helyes1/343ms14036 KiB
20Elfogadva3/332ms14408 KiB
21Időlimit túllépés0/3296ms10776 KiB
22Időlimit túllépés0/3298ms11716 KiB