Семејни врски#

Како решение на оваа задача се бараше програма која од стандарден влез ќе прочита еден цел број N - кој ги означува годините (двоцифрен број) на најмладиот од тројка членови на некоја фамилија, и на стандарден излез ќе ги отпечи годините на најстариот член. Притоа, најстариот член има години еднакви на збирот на другите два члена, годините на најмладиот се читаат од тастатура, а годините на преостанатиот член се исти со годините на најмладиот член, но со пермутирани (заменети) цифри (48->84, 35->53, итн).

Задачата се решава така што, по читање на годините на најмладиот член - N, го пресметуваме обратниот број на N (ги заменуваме цифрите на десетките и единиците - бидејќи се работи за двоцифрен број) и ги собираме овие броеви со што ги добиваме годините на најстариот член. Следи изворниот код на официјалното решение:

C++#

#include <iostream>
using namespace std;

int main()
{
    int a;
    cin >> a;
    
    int b = (a%10)*10 + a/10;
        
    cout << (a + b) << endl;
    return 0;
}

Паскал#

program semejnivrski;    (*Mario Talevski*)

var a:integer;

begin

readln(a);
writeln(a+a mod 10*10+a div 10);

end.

Решенијата дадени погоре имаат сложеност O(1).

Лисја#

Во оваа задача се бараше да напишеме програма која за зададена листа на денови и број на отпаднати листови во секој од тие денови, ќе го открие (и отпечати) денот во кој имало најмногу паднати листови.

Задачата се решава така што ќе ги изминеме сите денови и за секој од нив ќе провериме дали можеби во тој ден имало најмногу паднати листови. Притоа, во дополнителна променлива го чуваме тековниот максимум. Следи изворниот код на официјалното решение на задачата:

C++#

#include <iostream>
using namespace std;

int main()
{
    int di, ni;
    int bestD = -1, bestN = -1;
    
    for (int i=0; i<30; i++)
    {
        cin >> di >> ni;
        
        if (bestN == -1 || ni > bestN)
        {
                  bestN = ni;
                  bestD = di;
        }
    }
    
    cout << bestD << " noemvri" << endl;
    return 0;
}

Паскал#

program lisja;    (* Марио Величковски *)

var max,di2,di,ni:integer;

begin

     readln(di,ni);
     
     max:=ni;
     di2:=di;
     
      repeat
      readln(di,ni);
      if ni>max then
         begin
            max:=ni;
            di2:=di;
         end;
      until di=30;
       
     writeln(di2,' noemvri');
     readln;
     
end.

И овие решенија имаат сложеност O(1) - од причина што комплексноста не зависи од ниту една променлива и знаеме дека во влезот ќе има точно 30 денови (од еден месец - ноември).

Подароци#

Како решение на оваа задача се бараше програма која ќе открие кои од низа подароци можат да се сместат во кутија (за дадени димензии на подароците и кутијата). Притоа, еден подарок може да се смести во кутија ако тој е помал од кутијата, и неговите страни - подарокот е правоаголен објект - се паралелни со страните на кутијата. Проблемот го разгледуваме во две димензии - претпоставуваме дека кутијата има бесконечно голема висина.

Решението се сведува на читање на податоците дадени на влез и пресметување за секој еден подарок дали тој може да се смести во кутијата. Бидејќи страните на подарокот треба да бидат паралелни со страните на кутијата, разгледуваме два случаи - ротација од 0 и ротација од 90 степени (бидејќи двата објекти се правоаголници немора да пресметуваме за 180 и 270 степени - бидејќи ова е веќе опфатено со другите две ротации). Притоа, доколку еден подарок може да се смести во кутијата него го зачувуваме во низа и на крајот го печатиме бројот на елементите во низата, како и самите елементи. Следува изворниот код на официјалното решение:

C++#

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int dk, sk;    
    cin >> dk >> sk;

    int n;
    cin >> n;
    
    vector<pair<int, int> > gifts;
    
    for (int i=0; i<n; i++)
    {
        int dp, sp;
        cin >> dp >> sp;
        
        if ((dp <= dk && sp <= sk) || (dp <= sk && sp <= dk))
                gifts.push_back(make_pair(dp,sp));        
    }
    
    cout << gifts.size() << endl;
    
    for (int i=0; i<gifts.size(); i++)
        cout << gifts[i].first << " " << gifts[i].second << endl;

    return 0;
}

Ова решение има линеарна сложеност O(N).

Тест случаи#

Тест случаите можете да ги симнете како .zip архива тука(info).
Текстот и решенијата дадени погоре можете слободно да ги коментирате на форумот.

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
pas
lisja.pas 0.3 kB 1 20-Aug-2015 17:35 mariomako Лисја во паскал
zip
testovi_vtor_elektronski_2011.... 30.0 kB 1 20-Aug-2015 17:35 MOI
« This page (revision-11) was last changed on 20-Aug-2015 17:35 by mariomako