CCF 2017年12月第5題-商路
阿新 • • 發佈:2019-01-10
只有60分,不夠高效;應該是一字型的無法通過。// 20171203-商路問題.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" /*先對資料進行分層,資料輸入時統計每個結點到首都的距離(跳數),隨後對點進行排序,從低到高計算*/ #include<iostream> #include<set> #include<vector> using namespace std; struct city { long long pre; int len; long long v; long long f; }; int main() { int T; cin >> T; for (int i = 0; i < T; ++i) { int n; cin >> n; struct city * Citys = new struct city[n + 1]; long long * Values = new long long[n + 1]; for (int i = 1; i <= n; ++i) { cin >> Citys[i].pre; cin >> Citys[i].len; cin >> Citys[i].v; cin >> Citys[i].f; Values[i] = 0; } /*從後向前逆向掃描*/ long long pre; long long lens; long long Nvalue; long long Mvalue; for (long long i = n; i > 0; --i) { /*如果由該點連向前驅的商路能夠增加前驅的商路價值,前驅的商路就選擇改道*/ pre = Citys[i].pre; lens=Citys[i].len; while (pre>=1) { Mvalue = Values[i] + Citys[pre].v; if (Values[pre] < Mvalue) { Nvalue = Mvalue - (Citys[pre].f - lens)*(Citys[pre].f - lens);//幾乎可以認定這一步是最耗時的一步,所以這裡盡力優化 } lens += Citys[pre].len; pre = Citys[pre].pre; } } long long sum = 0; for (long long i = 1; i <= n; ++i) { sum += (Values[i]%1000000000000000000)%1000000000000000000; } cout << sum<<endl; } return 0; }