Hogyan oldjam ezt meg hatékonyan?
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!
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.
Í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.
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.
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...
Az oldal román nyelven van, be kell regisztrálni. Beküldhető C++, Java és Pascal forráskód tesztelésre.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!