1. 程式人生 > >CCF 2017年12月第5題-商路

CCF 2017年12月第5題-商路

// 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;
}

只有60分,不夠高效;應該是一字型的無法通過。