Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
5.0 kB
1
Indexable
Never
// #include <bits/stdc++.h>

#include <stdio.h>
#include <stdlib.h>

#include <cmath>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_set>
#include <vector>

using namespace std;

struct infor {
    int pos;
    double x;
    double y;
    double w;
};
// initial
double customer, satellite;
vector<double> routeList;
vector<double> weightList;

double distanceComputation(infor a, infor b) {
    double tmp_x{b.x - a.x};
    double tmp_y{b.y - a.y};
    double ans{pow(tmp_x, 2) + pow(tmp_y, 2)};
    ans = sqrt(ans);
    return ans;
}
// v w v w v w v
bool computationOnelevel(vector<int> route, vector<double> w, vector<infor> data) {
    double routeDistance{0};
    double weight{0};
    if (route.empty() || w.empty()) return false;
    if (route.begin() != route.end() - 1) return false;  // check return to original position
    // calculate distance;
    for (vector<int>::iterator it = route.begin(); it != route.end() - 1; it++) {
        infor a{data.at(*it)};
        infor b{data.at(*(it + 1))};
        double dis{distanceComputation(a, b)};
        routeDistance = routeDistance + dis;
    }
    routeList.push_back(routeDistance);
    // calculate weight
    if (w.at(0) > 12500) return false;
    int count{0};
    while (count < w.size() - 1) {
        if ((w.at(count) - w.at(count + 1)) != route.at(count + 1)) return false;
        count++;
    }

    return true;
}
bool computationTwolevel(vector<int> route, vector<double> w, vector<infor> data) {
    double routeDistance{0};
    double weight{0};
    if (route.empty() || w.empty()) return false;
    if (route.begin() != route.end() - 1) return false;  // check return to original position
    // calculate distance;
    for (vector<int>::iterator it = route.begin(); it != route.end() - 1; it++) {
        infor a{data.at(*it)};
        infor b{data.at(*(it + 1))};
        double dis{distanceComputation(a, b)};
        routeDistance = routeDistance + dis;
    }
    routeList.push_back(routeDistance);
    // calculate weight
    if (w.at(0) > 5000) return false;
    int count{0};
    while (count < w.size() - 1) {
        if ((w.at(count) - w.at(count + 1)) != route.at(count + 1)) return false;
        count++;
    }

    return true;
}

int main(int argc, char* argv[]) {
    ifstream input(argv[1]);
    ifstream correct_output(argv[2]);
    ifstream user_output(argv[3]);

    // get input
    input >> customer;
    input >> satellite;
    infor tmp;
    string line_buffer;
    vector<infor> data;
    while (getline(input, line_buffer)) {
        istringstream iss(line_buffer);
        iss >> tmp.pos;
        iss >> tmp.x;
        iss >> tmp.y;
        iss >> tmp.w;
        data.push_back(tmp);
    }
    input.close();

    // get optimal solution
    double opt;
    correct_output >> opt;
    correct_output.close();

    // get user answer
    double ans;
    user_output >> ans;

    // check one level route
    for (int i = 0; i < 3; i++) {
        vector<int> onelevelroute;
        vector<double> onelevelweight;
        string line_buffer;
        int tmp;
        double tmp_w;
        getline(user_output, line_buffer);
        istringstream iss(line_buffer);
        iss >> tmp;
        onelevelroute.push_back(tmp);
        while (iss >> tmp_w) {
            onelevelweight.push_back(tmp_w);
            iss >> tmp;
            onelevelroute.push_back(tmp);
        }
        if (!computationOnelevel(onelevelroute, onelevelweight, data)) {
            cout << 0 << '\n';
            return 0;
        }
    }

    // check two level route
    for (int i = 0; i < 6; i++) {
        vector<int> twolevelroute;
        vector<double> twolevelweight;
        string line_buffer;
        int tmp;
        getline(user_output, line_buffer);
        istringstream iss(line_buffer);
        while (iss >> tmp) {
            twolevelroute.push_back(tmp);
        }
        if (!computationTwolevel(twolevelroute, twolevelweight, data)) {
            cout << 0 << '\n';
            return 0;
        }
    }
    user_output.close();
    // check total route
    double totalRoute{0};
    for (auto v : routeList) {
        totalRoute = totalRoute + v;
    }
    if (totalRoute != ans) {
        cout << 0 << '\n';
        return 0;
    }
    cout << ans << ' ' << opt << '\n';
    // calculate the score
    if (ans / opt > 1.1)
        cout << 0 << '\n';
    else {
        cerr << (ans - opt * 1.1) / (opt - opt * 1.1) * 100 << '\n';
        cout << (ans - opt * 1.1) / (opt - opt * 1.1) * 100 << '\n';
    }

    // float ans,userans;
    // user_output >> userans;
    // correct_output >> ans;
    // cout << userans/ans << '\n';
    // output a float number which is in range [0,1]
    // this subtask score will be output number multiply score parameters
    // score parameters can be set on AdminWebServer
    // totol score is the sum of all subtasks score

    return 0;
}