Резисторы они же конденсаторы
От: olimp_20  
Дата: 27.06.15 10:28
Оценка:
Задача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?
Отредактировано 27.06.2015 11:06 olimp_20 . Предыдущая версия . Еще …
Отредактировано 27.06.2015 11:03 olimp_20 . Предыдущая версия .
Re: Резисторы они же конденсаторы
От: andy1618 Россия  
Дата: 27.06.15 21:51
Оценка:
Здравствуйте, olimp_20, Вы писали:

_>Задача1, задача2


А как ваш код справится вот с такой классической схемой (на примере резисторов)?


UPD: упс, пардон, в условии написано только про последовательно-параллельные схемы. Халява
Отредактировано 27.06.2015 21:54 andy1618 . Предыдущая версия .
Re[2]: Резисторы они же конденсаторы
От: olimp_20  
Дата: 28.06.15 09:30
Оценка:
Здравствуйте, 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-и тестов.
Помогите, пожалуйста разобраться с этой проблемой.
Re: Резисторы они же конденсаторы
От: olimp_20  
Дата: 28.06.15 09:41
Оценка:
Вопрос решен, если использовать
#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
.
Отредактировано 28.06.2015 14:29 olimp_20 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.