Cod sursa(job #1242616)

Utilizator BredPitBred Pit BredPit Data 14 octombrie 2014 19:36:18
Problema Oypara Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.8 kb
#include <stdio.h>
#include <math.h>
#define NMax 200010

const char IN[] = "oypara.in", OUT[] = "oypara.out";

struct point {
    double x;
    double y;
    int p;
};

int N;
double alpha = 1.0, theta[3];
point p[2 * NMax];

inline double sqr( double x ) {
    return x * x;
}

double h( double * theta, point p ) {
    double sum = theta[0] + theta[1] * p.x + theta[2] * p.y;
    return 1 / ( 1 + exp(-sum));
}

double J( double * theta ) {
    double ret = 0;
    for ( int i = 1; i <= N; ++ i ) {
        ret -= 1 / 2 * ( p[i].p * log(h(theta, p[i])) + (1 - p[i].p) * log( 1 - h(theta, p[i])) );
    }
    return ret / N;
}

void dJ( double * theta, double * out ) {

    out[0] = out[1] = out[2] = 0;

    for ( int i = 1; i <= N; ++ i ) {
        double val = sqr(h(theta,p[i]) - p[i].p);

        out[0] -= val;
        out[1] -= val * p[i].x;
        out[2] -= val * p[i].y;
    }

    out[0] /= N;
    out[1] /= N;
    out[2] /= N;
}

void solve() {

    static double out[3];

    theta[0] = 1;

    for ( int iter = 1; iter <= 20; ++ iter ) {
        dJ(theta, out);

        for ( int i = 0; i < 3; ++ i )
            theta[i] -= alpha * out[i];
    }

}

int main() {

    freopen(IN, "r", stdin);

    scanf("%d", &N);

    for ( int i = 1; i <= N; ++ i ) {
        int x, y1, y2;
        scanf("%d%d%d", &x, &y1, &y2 );

        p[2 * i - 1].x = x;
        p[2 * i - 1].y = y1;
        p[2 * i - 1].p = 1;

        p[2 * i].x = x;
        p[2 * i].y = y2;
        p[2 * i].p = 0;
    }

    N *= 2;

    solve();

    freopen(OUT, "w", stdout);
    //printf("%lf %lf %lf\n", theta[0], theta[1], theta[2]);
    printf("1000 %d 2000 %d\n", (theta[0] + 1000 * theta[1]) / theta[2], (theta[0] + 2000 * theta[1]) / theta[2]);
    return 0;
}