Резисторы они же конденсаторы
От: 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 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.