Kezdőoldal » Számítástechnika » Programozás » Hogyan oldjam ezt meg hatékonyan?

Hogyan oldjam ezt meg hatékonyan?

Figyelt kérdés

Adott egy A sorozatunk N db természetes számmal. Határozzuk meg azoknak a pároknak a számát, amelyeknél a két elem kettes számrendszerbeli alakját összehasonlítva az eltérés pontosan 4 bit.


1 ≤ N ≤ 100000

0 ≤ A[i] < 2^20


Pl.

Bemeneti adatok:

4

15 0 10 5

Kimeneti adatok:

2


mivel

15 – 1111

0 – 0000

10 – 1010

5 – 0101

A párok melyek pont 4 bittel térnek el egymástól:

(A(1), A(2)) = (15, 0) = (1111, 0000)

(A(3), A(4)) = (10, 5) = (1010, 0101)


A feladat az összes elemet összehasonlítva könnyen megoldható, de az n^2 műveletszám közel sem elég a követelményeknek.


Előre is köszi!



2017. ápr. 4. 18:26
 1/8 anonim ***** válasza:
0%
Először megoldod, mint matek feladatot. Aztán ha megvan a megoldás, csak átírod az algoritmusodat programnyelvre. Mindig így működik. Programnyelv nem végez munkát.
2017. ápr. 4. 18:30
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:

Abba az irányba indulnék el, hogy leválogatnám A-t az egyesek száma szerint. Csak azokat a párokat kellene tesztelni, ahol az egyesek száma maximum néggyel tér el.

Sokat nem jelent, de már valami.

Azokkal meg ne foglalkozz, akik nem is értik ez miért probléma.

2017. ápr. 4. 21:45
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:

Írtam egy ilyet, ezt alakítsd át magadnak, ahogy a házi szerint kellene csinálni:

program project1;


var

i,j,k, l, db : word;

kettesek : array of string;

elem1, elem2 : string;

n : word;


function kettesbe (dec : integer):string;

Var

bin : string;

begin

bin := '';

repeat

if (dec mod 2 = 0) then bin := '0' + bin else bin := '1' + bin;

dec := dec div 2;

until dec = 0;

kettesbe := bin;

end;


begin

Write('Kerem a sorozat elemszamat : ');

ReadLn(n);

SetLength (kettesek, n + 1);

i := 0;

repeat

kettesek[i]:=kettesbe(i);

inc(i);

until(i=n);

for i := 0 to n -1 do

for j := i+1 to n do

begin

elem1 := kettesek[i];

elem2 := kettesek[j];

db := 0;

for k := 1 to length (elem1) do

for l := 1 to length (elem2) do

begin

if elem1[k]<>elem2[l] then inc(db);

end;

if db>=4 then writeln(i,' ',j, ' elemek kozott legalabb 4 bit elteres van.');

end;

ReadLn;

end.

2017. ápr. 5. 16:59
Hasznos számodra ez a válasz?
 4/8 anonim ***** válasza:

Elvileg megírtam a leválogatást is, de gondja van, sajnos.

Rájöttem, hogy nem kellett volna repeat-until ciklust használni a feltöltésnél, mert a lépésszámlálós for ciklus kell ide.


program project1;


type

kettesekl = record

szam : integer;

kettes : string;

end;


var

i,j,k, l, db : word;

kettesek : array of string;

elem1, elem2 : string;

n, n2 : word;

levalogatva : array of kettesekl;


function kettesbe (dec : integer):string;

Var

bin : string;

begin

bin := '';

repeat

if (dec mod 2 = 0) then bin := '0' + bin else bin := '1' + bin;

dec := dec div 2;

until dec = 0;

kettesbe := bin;

end;


begin

Write('Kerem a sorozat elemszamat : ');

ReadLn(n);

SetLength (kettesek, n + 1);

for i :=0 to n do

kettesek[i]:=kettesbe(i);

n2 := 0;

db := 0;

for i := 0 to n do

elem1 := kettesek[i];

for k := 1 to length (elem1) do

begin

if (elem1[k]='1') then begin

inc(db);

end;

if db >= 4 then begin

inc(n2);

setlength (levalogatva, n2+1);

levalogatva[n2].szam := i;

levalogatva[n2].kettes := kettesek[i];

db := 0;

end;

end;

for i := 0 to n -1 do

for j := i+1 to n do

begin

elem1 := kettesek[i];

elem2 := kettesek[j];

db := 0;

for k := 1 to length (elem1) do

for l := 1 to length (elem2) do

begin

if elem1[k]<>elem2[l] then inc(db);

end;

if db>=4 then writeln(i,' ',j, ' elemek kozott legalabb 4 bit elteres van.');

end;

ReadLn;

end.

2017. ápr. 6. 05:18
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:

Válaszolók! Értitek, mit jelent ez a kérdésben: "de az n^2 műveletszám közel sem elég a követelményeknek"

Nem házifeladatról van szó, nem ilyen óvodás megoldásokra van szükség...

2017. ápr. 6. 06:08
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:
Engem is érdekelne, hogyan lehet ezt jól megoldani.
2017. ápr. 7. 11:04
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:
Kedves Kérdező! Hol elérhető ez a feladat, ahol tesztelni is lehet a mdgoldásokat?
2017. ápr. 7. 20:45
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:

[link]


Az oldal román nyelven van, be kell regisztrálni. Beküldhető C++, Java és Pascal forráskód tesztelésre.

2017. ápr. 11. 18:56

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!