Задача1,
задача2
| Код для задачи1 |
| #include <stdio.h>
#include <vector>
#include <cmath>
using namespace std;
double cv[7];//вектор значений емкостей конденсаторов
double C;//эталонное значение
double CAnsw;//ответ на задачу
void f(double* cv, int n);
//функции вычисления мин. значения, согласно условию задачи (сравнение с С)
double min2d(double a, double b);
double min3d(double a, double b, double c);
//------------------------------------------------------
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n;
scanf("%d", &n);
scanf("%Lf", &C);
for(int i=0; i<n; ++i)
scanf("%Lf", &cv[i]);
CAnsw = cv[0];
for(int i=1; i<n; ++i)
CAnsw = min2d(CAnsw, cv[i]);
f(cv, n);
if(fabs(C-CAnsw)<=0.01)
printf("YES\n");
else printf("NO\n");
return 0;
}
//------------------------------------------------------
//------------------------------------------------------
void f(double* cv, int n){
for(int i=0; i<n-1; ++i)//перебрать все пары конденсаторов из cv
for(int j=i+1; j<n; ++j){
double c1 = cv[i] + cv[j];//параллельное соединение
double c2 = (cv[i] * cv[j]) / c1; //последовательное соединение
CAnsw = min3d(CAnsw, c1, c2);
//создание новой последовательности без cv[i] и cv[j]
double cvSmall[7];
int k(0);
for(int z(0); z<n; ++z)
if(z!=i && z!=j) {cvSmall[k]=cv[z]; ++k;}
cvSmall[k]=c1;
f(cvSmall, k+1);//новая последовательность и с1
cvSmall[k]=c2;
f(cvSmall, k+1);//новая последовательность и с2
}
}
//------------------------------------------------------
double min2d(double a, double b){
return fabs(C-b)-fabs(C-a)>=0.0 ? a : b;
}
//------------------------------------------------------
double min3d(double a, double b, double c){
return fabs(C-b)-fabs(C-a)>=0.0 ? min2d(a, c) : min2d(b, c);
}
|
| |
Приведенное выше решение проходит все тесты.
Для задачи2 код программы (выше) имеет лишь одно отличие в выводе:
вместо
if(fabs(C-CAnsw)<=0.01)
printf("YES\n");
else printf("NO\n");
записано
CAnsw *= 1000000;
CAnsw = floor(CAnsw);
CAnsw /= 1000000;
printf("%0.6Lf\n", CAnsw);
для теста, заданного в условии задачи, — ответ правильный. А для всех 7-и тестов на сервере: "Неправильный ответ". Такое впечатление: либо неправильный вывод (пробовал разные варианты), либо неправильное вычисление.
Подскажите, пожалуйста: с чем могут быть связаны проблемы в программе для задачи2?
Здравствуйте, olimp_20, Вы писали:
_>Задача1, задача2
А как ваш код справится вот с такой классической схемой (на примере резисторов)?
UPD: упс, пардон, в условии написано только про последовательно-параллельные схемы. Халява
Здравствуйте, andy1618, Вы писали:
для приведенных выше условий задач — программа правильная, не только потому, что на одном сайте прошла, а на другом — нет, но и еще потому, что такая же программа на Паскале задачу2 прошла успешно.
| Код на Паскале |
| program Rez;
type TMas = array [1..7] of real;
var
fl:text;
cv: TMas;
Ce, CAnsw:real;
n:integer;
i:integer;
function min2d(a,b:real):real;
begin
if abs(Ce-b)-abs(Ce-a)>=0.0 then min2d:=a
else min2d:=b;
end;
function min3d(a,b,c:real):real;
var x,y,z:real;
begin
x:=abs(Ce-b);
y:=abs(Ce-a);
z:=x-y;
if z>=0.0 then min3d:=min2d(a, c)
else min3d:=min2d(b, c);
end;
procedure f(cv:TMas; n:integer);
var i,j,z,k:integer;
c1,c2:real;
cvSmall:TMas;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
begin
c1 := cv[i] + cv[j];
c2 := (cv[i] * cv[j]) / c1;
CAnsw := min3d(CAnsw, c1, c2);
k:=1;
for z:=1 to n do
if(z<>i)and (z<>j) then
begin
cvSmall[k]:=cv[z];
k:=k+1;
end;
cvSmall[k]:=c1;
f(cvSmall, k);
cvSmall[k]:=c2;
f(cvSmall, k);
end;
end;
end;
begin
assign(fl,'input.txt');
reset(fl);
readln(fl,n,Ce);
for i:=1 to n do
read(fl,cv[i]);
close(fl);
CAnsw := cv[1];
for i:=2 to n do
CAnsw := min2d(CAnsw, cv[i]);
f(cv, n);
assign(fl,'output.txt');
rewrite(fl);
writeln(fl,CAnsw:0:6);
close(fl);
end.
|
| |
Проблема в программе на С++ в формате вывода: и вот тут я не могу понять, что требуется от меня, поскольку перепробовал разные способы выводить и по 6 цифр после запятой, и не менее 6-ти, но результат — "Неправильный ответ" для всех 7-и тестов.
Помогите, пожалуйста разобраться с этой проблемой.
Вопрос решен, если использовать
#include <fstream>
...
fileOut.setf(ios::fixed);
fileOut.precision(6);
А также, если:
scanf("%lf", &C);
for(int i=0; i<n; ++i)
scanf("%lf", &cv[i]);
и
printf("%0.6lf\n", CAnsw);
Как указано правильно:
вся разница между MS VC и GNU CАвтор: pagid
Дата: 28.06.15
.