72212024-01-03 18:58:17czitaA lehető legkevesebb átszállás (50 pont)csharpElfogadva 50/5048ms32052 KiB
using System;
using System.Collections.Generic;


namespace átszállás
{
    internal class Program
    {



        static int[] be()
        {
            string[] sts = Console.ReadLine().Split(' ');
            int[] st = new int[3];
            st[1] = int.Parse(sts[1]);
            st[0] = int.Parse(sts[0]);
            return st;
        }
        static void Main(string[] args)
        {
            int[] st = be();//alapadatok beolvasása
            int N = st[1];
            int M = st[0];
            st = be();//első vonat beolvasása
            List<int[]> v = new List<int[]>();
            st[2] = 1;

            if (st[0] != 1) Console.WriteLine(-1);//nem a kezdőállomásról indul az első vonat
            else
            {
                int indulas = st[0], erkezes = st[1], vonat = 1;
                for (int i = 1; i <= M; i++)//=, hogy az utolső elemet is 
                {
                    if (indulas == st[0])//ha azonos induló állomáson vagyunk
                    {
                        if (erkezes < st[1])
                        {
                            erkezes = st[1];//az adott állomásról a legtávolabb menő vonat
                            vonat = i;
                        }
                    }
                    else//másik indulló állomáson vagyunk
                    {
                        int[] t = new int[3];//az előző leghosszabb adatait rögzítjük
                        t[0] = indulas;
                        t[1] = erkezes;
                        t[2] = vonat;
                        v.Add(t);//beteszük egy listába
                        indulas = st[0];//a következő indulásnál keressük a legtávolabbi érkezést
                        erkezes = st[1];
                        vonat = i;

                    }
                    if (i < M) st = be();//az utolső elem után ne olvasson be
                }
                //az utolső intervallumot betesz a lsitába
                int[] t1 = new int[3];
                t1[0] = indulas;
                t1[1] = erkezes;
                t1[2] = vonat;
                v.Add(t1);
                //belső intervallumok kizárása pl. 1 7, 2 5 a 2 5 felesleges
                List<int[]> v2 = new List<int[]>();//átmásoljuk egy új listába a jó elemeket
                v2.Add(v[0]);//betesszük az elős elemet, ez biztos
                erkezes = v[0][1];//rögzítjük mikor érezik meg
                foreach (var item in v)
                {
                    if (item[1] > erkezes)//ha adott elem később fejeződik be, mint ahogy az aktuális pl 1 7, 5 8
                    {
                        v2.Add(item);
                        erkezes = item[1];//ez lesz az aktuális
                    }
                }
                //a legkedvezőbb intevallumok kiválasztása
                //kiválasztjuk kér egymást követő intervallumból a legnagyobbat
                List<int[]> v3 = new List<int[]>();
                if (v2.Count == 1)//ha csak 1 intervallum van nem kell vizsgálni, ez a legjobb
                {
                    v3.Add(v2[0]);
                }
                else//ha több van
                {
                    v3.Add(v2[0]);//betesszük az elsőt, ez az induló járat biztos benne van
                    erkezes = v2[0][1];//az elős vonat ekkor fog megérkezni
                    int maxi = 1;//ez a maximumkereésé kezdőeleme
                    for (int i = 1; i < v2.Count; i++)//végig a listán
                    {
                        if (v2[i][0] <= erkezes)//ha az adott lemnek és az eddigi legjobbnak van közös eleme 
                            //pl 1 7, 6 10
                        {
                            if (v2[i][1] > v2[maxi][1])//megnézzük, hogy ez nagyobb-e mint az eddigi legtávolabbi pont
                            {
                                maxi = i;//ha igen ez a legtávolabbi, ez egy maximum keresés
                            }
                        }
                        else//ha nincs közös pontjuk, akkor az eddigi legnagyobbhoz képest kell keresni a legtávolabbi pontot
                        {
                            v3.Add(v2[maxi]);//betesszük maximális elemet a listába
                            erkezes = v2[maxi][1];//beállítjuk az ő érkezését, aminél nagyobbat kell keresnünk
                            maxi = i;//az aktuális elem, amely az eddigi intervallumon kívül van, az lezs a maximum
                        }
                    }
                    v3.Add(v2[maxi]);//az utolsó elemet nem vizsgálja, ezért hozzáadjuk.
                }
                //van e átfedés az intervallumok között mert az 1 2, 3 10 esetet az előző nem vizsgálta
                //eldöntés tétele
                int cv = 1;//ciklusváltozó 1 mert az előző elemhez hasonlitjuk az aktuálisa elemet.
                while (cv < v3.Count && //a tömbön belül vagyunk-e
                    v3[cv][0] <= v3[cv - 1][1])//az aktuális lemenek, és az előzőnek van közös pontja
                {
                    cv++;//ekkor megyünk a következőre
                }
                if (cv < v3.Count||//ha a ciklus előbb leállt a végénél, akkor talált egy olyan esetet, ahol nincs közös pont
                    v3[v3.Count-1][1]!=N)//nem bztos, hogy a végállomásig elé tudunk menni, megvizsgáljuk az utolsó elemet, hogy az a végállomás-e
                {
                    Console.WriteLine(-1);//ha nincs átfedés, vagy nem ér el a végállomásig, akkor nem lehetséges
                }
                else
                {
                    Console.WriteLine(v3.Count - 1);//kiírjuk az vonatok számát -t mert az átszállást kérdezi
                    foreach (var item in v3)
                    {
                        Console.Write(item[2] + " ");//kiíratjuk a vonat számát
                    }
                    Console.WriteLine();//miután Write-ot használtunk le kell zárni a sort, különben hibás megoldást fog adni a program
                }
            }
            Console.ReadKey();
        }
    }
}


RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/030ms20936 KiB
2Elfogadva0/048ms28100 KiB
3Elfogadva1/129ms22124 KiB
4Elfogadva1/129ms22288 KiB
5Elfogadva2/229ms22464 KiB
6Elfogadva2/229ms22672 KiB
7Elfogadva2/230ms23236 KiB
8Elfogadva2/232ms23592 KiB
9Elfogadva2/234ms24460 KiB
10Elfogadva2/235ms25044 KiB
11Elfogadva2/237ms26116 KiB
12Elfogadva2/241ms27076 KiB
13Elfogadva2/232ms24452 KiB
14Elfogadva2/234ms24820 KiB
15Elfogadva2/235ms26060 KiB
16Elfogadva2/241ms27436 KiB
17Elfogadva2/241ms28780 KiB
18Elfogadva2/243ms29552 KiB
19Elfogadva2/245ms30212 KiB
20Elfogadva2/245ms30460 KiB
21Elfogadva2/246ms31092 KiB
22Elfogadva2/248ms31604 KiB
23Elfogadva2/246ms31112 KiB
24Elfogadva2/248ms31436 KiB
25Elfogadva2/248ms32052 KiB
26Elfogadva2/248ms31796 KiB
27Elfogadva2/248ms31464 KiB
28Elfogadva2/246ms31800 KiB