先補上前兩天的學習總結,假裝現在是10.9.
今天覆習了hja的講課內容,總結出重要的有3點,第一點是比賽的對於long long int的應用,**如下
#ifdef win32
# define lld "%i64d"
#else
# define lld "%lld"
#endif
...
int main()
第二點是關於noip 2013的積木問題
有一行 n 個坑, 每個坑的大小為 ai. 每次操作可以往編號連續的一些坑 裡填一單位土. 坑里土不可溢位. 問最小運算元. n≤ 105. 有 o(n) 的簡便方法。
每次選擇剩餘的大小最小的坑, 把它填滿, 並把它左右所有可填的坑都 填一下. 依此類推.複雜度是 o( n 個坑 ∗ 填坑計算的複雜度 ).
乙個坑已經被填了多少土取決於它左右最近的已經被填過的坑的大小. 如何快速找到」 左右最近」 ?
我們需要想一種策略能應對多樣的資料,接下來就要開始說說貪心的可行性了:我們可以把當前的高度與前面乙個的高度比較,倘若比前面的高,那我們就需要在前面的高度上在向上蓋,倘若比前面的低,那麼前面的在蓋的時候一定可以把當前位置達到目標,所以我們只需要累加所有h[i] - h[i] > 0 的值即為答案。我們在回到那個1 的問題,正是因為每次加一才能這樣貪心,如果每次的高度自定的話,顯然是不可行的,一旦有空的高度就一定會錯誤。
附**。
#include
#include
using
namespace
std;
int a[100000];
int min(int x,int y)
int main()
cout
0;}
第三點是貪心的鉤碼模型
你有一堆鉤碼. 每個鉤碼有質量 wi 和承重 li. 你要把它們串成一串. 設 i 的下面的所有鉤碼的質量是 mi. 最小化最大的 mi−li.
假設 i 在 j 上面. 原題的實質為
max < max
假設 i 在 j 上面. 原題的實質為
max < max
顯然 −lj < wi−lj,wj−li > −li
所以只需要
wj−li < wi−lj
即 wj +lj < wi +li
就變成按 wi +li 排序了. 很反直覺有木有.
今天先到這裡了,晚安
補坑,附上歸併排序求逆序對的程式
#include
#include
using
namespace
std;
const
int maxn = 100003;
int a[maxn], tmp[maxn],n;
long
long ans = 0;
void getinverse(int l, int r)
int md((l + r) >> 1);
getinverse(l, md);
getinverse(md, r);
for (int i = l, j = md, k = l; i < md || j < r;) else
}for (int i = l; i < r; ++ i)
}int main()
109之今日學習
include int main system pause return 0 2.寫程式求一元二次方程的解。define m 0.000001 include include int main if n 0 system pause return 0 3.練習 編寫 演示多個字元從兩端移動,向中間匯...
每日練習109
1.在同一通道上同一時刻,可進行雙向資料傳送的通訊方式是 c單工 半雙工全雙工 上述三種均不是 如果在通訊過程的任意時刻,資訊只能由一方a傳到另一方b,則稱為單工。如果在任意時刻,資訊既可由a傳到b,又能由b傳a,但只能由乙個方向上的傳輸存在,稱為半雙工傳輸。如果在任意時刻,線路上存在a到b和b到a...
模擬109 題解
似乎是顯然的狀壓。dp 表示第 i 層,其中每個點到達終點路徑條數的奇偶性為 s 的方案數。直接用位運算轉移,複雜度是 o m k 2 k 然後卡卡常 把 k 迴圈展開 就過了。似乎考慮單次的變化量,可以繼續消掉乙個 k 然後就好了。手玩發現合法的狀態一定很多,所以直接隨機集合對搞就好了。實際上集合...