제출 #1206808

#제출 시각아이디문제언어결과실행 시간메모리
1206808TroySerRotating Lines (APIO25_rotate)C++20
5 / 100
3093 ms1588 KiB
#include "rotate.h"
#include <vector>
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll FULL_ROTATION = 50000;

ll energyCalc(vector<int> v) {

    ll totCost = 0;
    for (ll i = 0; i < v.size(); i++) {
        for (ll j = i + 1; j < v.size(); j++) {
            totCost += min((ll)abs(v[i] - v[j]), FULL_ROTATION - abs(v[i] - v[j]));
        }
    }

    return totCost;

}

void energy(int N, std::vector<int> v) {

    ll globalBest = 0;
    vector<pair<ll, ll> > instructions;

    for (ll currAngle = 0; currAngle < FULL_ROTATION/2; currAngle++) {

        ll currAlternative = currAngle + FULL_ROTATION/2;
        ll currEnergy = energyCalc(v);
        
        vector<int> currV;
        currV.reserve(N);
        for (ll i = 0; i < N; i++) currV.push_back(v[i]);

        vector<pair<ll, ll> > currentInstructions;

        for (ll currRod = 0; currRod < N; currRod++) {

            ll tmp = currV[currRod];

            currV[currRod] = currAngle;
            ll energyIncreaseAngle = energyCalc(currV);
            currV[currRod] = tmp;

            currV[currRod] = currAlternative;
            ll energyIncreaseAlt = energyCalc(currV);
            currV[currRod] = tmp;

            if (max(energyIncreaseAlt, energyIncreaseAngle) < currEnergy) continue;

            if (energyIncreaseAngle >= energyIncreaseAlt) {
                currentInstructions.push_back({currRod, currAngle - tmp});
                currV[currRod] = currAngle;
                currEnergy = energyIncreaseAngle;
            } else {
                currentInstructions.push_back({currRod, currAlternative - tmp});
                currV[currRod] = currAlternative;
                currEnergy = energyIncreaseAlt;
            }

        }

        ll finalEnergy = energyCalc(currV);
        if (finalEnergy > globalBest) {
            globalBest = finalEnergy;
            instructions = currentInstructions;
        }

    }

    for (auto &instruct: instructions) {
        vector<int> theRod;
        theRod.push_back(instruct.first);
        rotate(theRod, instruct.second);
    }

    // rotate({0, 1}, 1500);
    // rotate({1}, 25);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...