infoarena

infoarena - concursuri, probleme, evaluator, articole => .CAMPION => Subiect creat de: FMI Romila Remus Arthur din Decembrie 14, 2010, 20:10:37



Titlul: Desen
Scris de: FMI Romila Remus Arthur din Decembrie 14, 2010, 20:10:37
Am incercat sa fac problema Desen (http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=220) insa iau 0 puncte si nu inteleg ce e gresit la rationament :
1. ca sa adaug un nod la arborele deja format caut muchia de cost minim.
2. dupa ce am legat nodul,caut alte puncte al caror cost ar putea fi micsorat.

Cod:
#include <fstream>
#include <iomanip>
#include <cmath>
#define nmax 1002

using namespace std;

ifstream in("desen.in");
ofstream out("desen.out");

double X[nmax],Y[nmax];
int N,i,j;
double D[nmax];//muchia minima cu care am legat un nod de arbore
double C[nmax][nmax];//costul intre oricare 2 noduri

int main()
{
    in>>N;
    double S = 0,s;
    for(i=1;i<=N;i++)in>>X[i]>>Y[i];
    for(i=1;i<N;i++)for(j=i+1;j<=N;j++)C[i][j]=C[j][i] = sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));//calculez distanta intre oricare 2 puncte
    out<<setprecision(6);out<<fixed;
    out<<S<<'\n';
    for(i=2;i<=N;i++)
    {
        D[i] = 9999999;
        for(j=1;j<i;j++)
            if(C[i][j]<D[i])D[i]=C[i][j];
        S+=D[i];//actualizez costul
        for(j=1;j<i;j++)
            if(D[j]>C[i][j])S-=D[j],S+=D[i];//elimin muchia anterioara si o adaug pe cea noua
        out<<S<<'\n';
    }
    return 0;
}


Titlul: Răspuns: Desen
Scris de: Dragos-Alin Rotaru din Decembrie 14, 2010, 20:33:34
Ai aceasta problema si aici (http://infoarena.ro/problema/desen) - pentru ca inainte de toate a fost infoarena :)
Vezi poate te ajuta cu ceva testele si indicatiile postate de ceilalti.


Titlul: Răspuns: Desen
Scris de: Petru Trimbitas din Decembrie 14, 2010, 22:06:51
evaluatorul de pe campion nu merge bn pt pb asta :(