Cod sursa(job #2342897)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 13 februarie 2019 15:13:59
Problema Aria Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("munte2.in");
ofstream fout ("munte2.out");
#define MAX_N 103
#define MAX_K 33
const double INF   = 1000000000.0;
double dp [MAX_N][MAX_K];
int g [MAX_N][MAX_K];
int n, K, l;
int valid [MAX_N][MAX_N];
double dist [MAX_N][MAX_N];
struct Varf {
    int x, y;
}p [MAX_N];
bool Test (int i, int j){
    int d1, d2, H, h, hh, x;
    for (int k = i + 1; k < j; k++)
    {
        d1 = p [k].x - p [i].x, d2 = p [j].x - p [k].x;
        H = p [j].y, h = p [i].y, hh = p [k].y;
        x = (d1 + d2) * (h + H) - ((d1 * (hh + h) + d2 * (hh + H)));
        if (x <= 0) return 0;
    }
    return 1;
}
double Dist (int i, int j){
    return sqrt ((double)((p [j].x - p [i].x) * (p [j].x - p [i].x) + (p [j].y - p [i].y) * (p [j].y - p [i].y)));
}
void Rec (int i, int j){
    if (!j)return;
    Rec (g [i][j], j - 1);
    fout << i << " ";
}
void Afisare (){
    fout << dp [n][K] << '\n';
    Rec (n, K);
}
int main (){
    fin >> n >> K >> l;
    for (int i = 1; i <= n; i ++)
        fin >> p [i].x >> p [i].y;
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= K; j ++)
    		dp [i][j] = INF;
    for (int i = 2; i <= n; i ++){
        for (int j = 1; j < i; j ++){
            dist [i][j] = Dist (i, j);
            if (dist [i][j] > l)continue;
            valid [i][j] = Test (j, i);
        }
    }dp [1][1] = .0;
    for (int i = 2; i <= n; i ++){
        for (int j = 1; j < i; j ++){
            if (valid [i][j] == 1){
                for (int p = 1; p < K; p ++){
                    if (dp [j][p] + dist [i][j] < dp [i][p + 1]){
                        dp [i][p + 1] = dp [j][p] + dist [i][j];
                        g [i][p + 1] = j;
                    }
                }
            }
        }
    }
    Afisare ();
    return 0;
}