只有90分,最後乙個點沒通過,想不明白,放這裡晾著吧,有時間反思一下,
大概思路如下:
首先建立乙個圖的資料結構來描述它,然後建立乙個以時間為順序的任務表,這個表我們利用map內建的紅黑樹來實現「插入即排序的功能」,然後以這個時間序為事件發生順序,按照邏輯模擬就可以了,當然我們會發現同一時刻查詢和更新事件發生時,優先更新,類似的,所以我們在查詢時間+0.1什麼的把它的優先順序降低,接下來就是大模擬了。
設計思想:
step1
靜態設定
首先想乙個基礎的資料結構表達題目的所有資料,所以有圖,然後想怎麼操作這些結點,想著大模擬,那以時間模擬,所以建立乙個以時間為序的任務鍊錶,因為要排序,所以選用map;
要完整的描述每個結點,我們仔細閱讀題目發現,只需要記錄每個結點的鏈就可以了,所以加了個v[501], 圖用m[501]
要完整的描述每個任務,我們需要建立乙個結構體task,分析任務有三種狀態,查詢,新增結點,更新鍊錶 ,於是設定乙個status,每個任務處理的物件是節點,所以有node,如果是新增點,就得用add_value,如果是更新鍊錶就得有list,於是乎乙個完整的任務描述就ok了
step2
動態設定
接下來考慮,操作,以時間為序,處理任務,所以用map p,考慮各個操作的優先順序,所以選用double型別,這樣通過±0.1 上下調優先順序,作為時間所用的型別。
step3
然後考慮細節問題,具體實現需要那個模組
一開始創世點為0 init()
讀取的輸入需要處理 input()
建立乙個任務 放到main 和 處理任務的函式中
新增乙個任務到任務表 add_task
執行乙個任務 process_unit
開始處理 start
劃分功能模組,設計好整體的思路,再處理一下具體的細節,很快就可以寫出乙個還不錯的程式
#include
#include
#include
#include
#include
#include
//#define debug
using
namespace std;
enum
;//每個任務分為三個狀態,查詢,新增結點,更新鍊錶
struct task
;vector<
int> v[
501]
;//每個結點的鏈
vector<
int> m[
501]
;//圖
map<
double
,vector
> p;
//任務列表 第乙個引數是時間 為什麼不用int 是因為在同一時刻三個狀態發生時有優先順序,於是直接+-0.1來改變
//他們在任務列表裡的順序
double t,last_t;
void
init
(int n)
void
add_task
(double time,task& a)
else
} vector<
int>
input()
//由於每次讀入不知道是讀入兩個還是三個,所以我們按行讀取
return val;
}void
process_unit
(double time,task &a)
//事件處理單元,處理每乙個事件
cout<[len]
<}else
if(a.status==add_single)
}else
if(a.status==add_list)}}
else
}void
start()
}int
main()
int k;
vector<
int>val;
cin>>t>>k;
cin.
get();
while
(k--
)else
}#ifdef debug
cout<<
"開始 任務列表:"
python簡單區塊鏈模擬
最近學習了一點python,那就試著做一做簡單的程式設計練習。首先是這個程式設計的指導圖,如下 對的,類似乙個簡單區塊鏈的模擬。如下 class dadablockcoin index 索引,timestamp 時間戳,data 交易記錄,self hash交易hash,last hash,上個ha...
區塊鏈 區塊鏈雜湊演算法
雜湊演算法是區塊鏈中保證交易資訊不被篡改的單向密碼機制。雜湊演算法接收一段明文後,以一種不可逆的方式將其轉化為一段長度較短 位數固定的雜湊資料。它有兩個特點 加密過程不可逆,意味著我們無法通過輸出的雜湊資料倒推原本的明文是什麼 輸入的明文與輸出的雜湊資料一一對應,任何乙個輸入資訊的變化,都必將導致最...
區塊鏈節點和區塊區別 區塊鏈的「區塊」和「鏈」
2017年以來,區塊鏈大火,但是其技術相對生澀。很多 紛紛用通俗易懂的漫畫方式,簡單明瞭的體現出來了區塊鏈的區別和特點。區塊鏈由以前的一人記賬,變成了大家一起記賬的模式,讓賬目和交易更加安全,這就是分布式資料儲存。此外,區塊鏈相關的技術除了分布式儲存,還有去中心化 智慧型合約 加密演算法等等。分布式...