這一題題目很長,但理解起來並不困難。
有一點很重要,那就是題目輸入的順序是城市編號的順序,而城市編號的順序又直接決定了城市之間的上下級關係。雖然編號小的不一定是大編號的下級,但下級城市的編號一定比上級城市的編號小,如何利用這一點非常重要。
假如城市a的下級城市是b,c,d ;那如果b,c,d 本身的商路價值都是最大話之後,a 只能在b,c,d 中挑選乙個與之相連,或者不相連,來使自己的商路價值最大話。也就是如果b,c,d的商路價值都是已知的了,那a 的商路價值就都是已知的了。 如此以來,只需要按照逆序從後向前分別計算商路的最大值就可以了。
比如題中所給的第乙個例子: 開始時假設所有城市的商路最大價值都是0, 這時最後乙個城市的商路價值就是真實的了,隨後以此找它的上級城市(不一定時直接上級),判斷上級城市與最後乙個城市相連會不會讓它的商路價值增加就可以了,當處理到首都之後就可以處理倒數第二個城市了。
估算一下演算法複雜度, 首先掃瞄一遍至少是 n , 然後每乙個城市要處理它的上級,是完美二叉樹的話,那每個城市的上級應該是log i , 如果所有城市排成一條線的話那每個城市的上下級就是i-1 了,這樣最好的情況下複雜度是nlogn 最差的情況是 n^2 看起來還可以接受。
按照這個思路寫乙份**提交試試看:
// 20171203-商路問題.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
/*先對資料進行分層,資料輸入時統計每個結點到首都的距離(跳數),隨後對點進行排序,從低到高計算*/
#include#include#includeusing namespace std;
struct city ;
int main()
/*從後向前逆向掃瞄*/
long long pre;
long long lens;
long long nvalue;
long long mvalue;
for (long long i = n; i > 0; --i)
lens += citys[pre].len;
pre = citys[pre].pre;
}} long long sum = 0;
for (long long i = 1; i <= n; ++i)
cout << sum<} return 0;
}
只有60分,不夠高效;應該是一字型的無法通過。 CCF2023年12月第3題 Crontab
這一題要求我們對給定的配置資訊,在特定的時間段輸出需要執行的任務。在unix中每分鐘檢查一次,最簡單的思路就是用迴圈模擬時間的推移,每分鐘匹配一次規則。這種情況在真正的系統裡是很高效的,因為時間是真實流動的。但如果是模擬執行則有些浪費時間。如果在考試過程中想不到其它方法這種暴力方法至少可以通過70 ...
CCF 2023年3月第5題 引水入城(80分)
這一題是很明確的最大流問題 但是無論是用dfs 還是 bfs 都肯定會超時。因為規模太大了。如果想練手網路流可以試試提交乙個殘量網路的 應該只能得50分左右。dfs,bfs 有缺陷得地方在於沒有認識到這一題圖得結構是非常規整得。這一題得方案還是使用動態規劃來做。將最大流問題轉換為最小割問題 接下來只...
CCF認證2023年12月第1題 出現次數最多的數
試題編號 201312 1 試題名稱 出現次數最多的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個正整數,找出它們 現次數最多的數。如果這樣的數有多個,請輸出其中最小的乙個。輸入格式 輸入的第一行只有乙個正整數n 1 n 1000 表示數字的個數。輸入的第二行有n個...