Форум » Массивы, сортировка, работа с файлами » задача 26 №46 не сходится ответ:количество получается 72 вместо 36 ,минимум тот же » Ответить

задача 26 №46 не сходится ответ:количество получается 72 вместо 36 ,минимум тот же

Константин: var A:array [1..500] of integer; q,w,s,R,L,k,i,j,r1,N,n1,t,h:integer; s1:string; f:text; begin N:=500; w:=MaxInt; Assign(f,'26-46.txt'); Reset(f); i:=1; readln(f,s1); while not eof(f) do begin readln(f,s1); val(s1,n1,r1); A:=n1; i+=1; end; for i:=1 to (N-1) do begin q:=i; for j:=(i+1) to N do if A[j]<A[q] then q:=j; if q<>i then swap(A[q],A); end; for i:=1 to (N-2) do for j:=(i+1) to (N-1) do for t:=(i+2) to N do begin if ((A mod 3)+(A[j] mod 3)+(A[t] mod 3)) mod 3<>0 then continue; s:=(A+A[j]+A[t]) div 3; L:=1; R:=N; while L<R-1 do begin h:=(L+R) div 2; if s<A[h] then R:=h else L:=h; end; if s=A[L] then begin k+=1; w:=min(w,s); end; end; writeln(k,' ',w); end.

Ответов - 3

Mike_Boone: Среднее арифметическое может быть нецелым числом. Где только возможно, имеет смысл избегать вещественную арифметику. Выполняйте проверку нахождения среднего арифметического трех элементов в массиве домжножением на 3 элемента массива, а не деления на 3 суммы чисел тройки(ведь среднее может быть дробным числом, а div лишь берет целую часть от деления). Ответы корректные. В принципе алгоритмическая сложность совпадает с вашей программой(учитывая, что обращение к ключу мэпа выполняется за логарифм). #include <bits\stdc++.h> using namespace std; typedef long double ld; #define int long long #define all(a) a.begin(), a.end() #define pb push_back void fast_io() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } signed main() { fast_io(); //freopen("26.txt", "r", stdin); int n; cin >> n; vector <int> a(n); map <int, bool> yes; int ans = 1e18; int cnt = 0; for(int i = 0; i < n; i++) cin >> a[ i], yes[a[ i] * 3] = 1; for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) for(int k = j + 1; k < n; k++) if ((a[ i] + a[j] + a[k]) % 3 == 0 && yes[a[ i] + a[j] + a[k]]) { cnt++; ans = min(ans, a[ i] + a[j] + a[k]); } cout << cnt << " " << ans / 3;; return 0; }

Константин: Я вас не понимаю.Нас спрашивают о числах в файле,которые одновременно и ср.ар.Но так как все числа в файле целые ,сл-но не имеет смысла искать нецелые среди целых,поэтому если сумма трёх не дел на 3 ,мы их не рассматриваем--в программе continue.А div в нашем случае равен частному,так как делятся только числа,кратные 3.

Mike_Boone: Константин пишет: for t:=(i+2) to N do Первый параметр ответа (количество пар) у вас не совпадает, потому что некоторые пары вы учитываете несколько раз. Верно будет сделать for t:= (j + 1) to N do К тому же, тройку циклов верно будет переписать так: for i:= 1 to N do for j := i + 1 to N do for t := j + 1 to N do




полная версия страницы