暑假第二十測

2022-05-29 05:06:09 字數 3169 閱讀 8064

題解:第一題:

這道題最先想到的就是貪心,但是純貪心明顯是不對的,

如 2 2 1 3 3 貪心結果為2 2 (133)但實際是2 (21) 3 3 。

所以這樣是不對的。

那要怎麼做呢.....考慮用dp.........

階段應該是明顯的就是第幾個數,我們還是要用到貪心的思想,

就是保證在最後面的合起來的數盡可能的小

我們用f[i]表示到第i這個數的最多的組數。

b[i]表示從1到i的所有數的和(很明顯如果合併從k到i那麼合併後的數就是b[i]-b[k]);

s[i]表示到第i這個階段的最後乙個數的大小。

所以轉移方程就是:f[i]=max(f[k]+1); (b[i]-b[k]>=s[k])

s[i]=b[i]-b[k];

#includeusing

namespace

std;

const

int inf =1e8;

const

int m = 5005

;int

dp[m], tot;

long

long

res[m], h[m], sum[m];

intmain()

}printf(

"%d\n

",n -dp[n]);

}

view code

第二題:

動態規劃,定義f[i][j]代表在i時間,能力值為j的最多工作次數。

對應最後三種選擇:

①不作為 f[i][j]=f[i-1][j],

②上課 f[i][j]=f[上課前乙個時刻][任意],

③做工作 f[i][j]=f[i-po[j]][j]+1 (po[j]為能力值<=j的工作一次的最短用時)。

對於②可以在預處理出ke[i][j]在i時刻結束,能力值達到j的課程的最晚開始時間。dp過程中處理出g[i]=max。

g[t]即為答案。

#includeusing

namespace

std;

const

int inf =1e8;

const

int m = 10005

;int cl[m], clt[m], mt[m], dp[m][205

];struct nodep[m];

/*bool cmp1(node a, node b)

*/bool

cmp2(node a, node b)

intmain());

a =max(a, a);

}/*for(int a = 1; a <= a; a++)

if(cls[a].size() > 1)sort(cls[a].begin(), cls[a].end(), cmp1);

*/for(int i = 1; i <= n; i++)

sort(p + 1, p + 1 +n, cmp2);

memset(mt,

127, sizeof

(mt));

for(int i = 1; i <= n; i++)

mt[p[i].c] =min(mt[p[i].c], p[i].d);

}for(int j = p[n].c + 1; j <= a; j++)mt[j] =mt[p[n].c];

memset(dp, -1, sizeof

(dp));

dp[0][1] = 0

;

for(int t = 0; t <= t; t++)

}for(int p = 1; p <= a; p++)

ans =max(ans, dp[t][p]);

printf(

"%d\n

", ans);

}

view code

第三題二分答案。

列舉距離特殊點最近的建造的樹洞是哪乙個,記為x。

在圖中刪除能夠在二分的時間內到達該樹洞x的所有點。

此時圖變為若干條獨立的鏈,直接求最少需要的樹洞數。

在所有列舉的情況中取最小值,與k比較確定二分範圍變化。

#includeusing

namespace

std;

const

int m = 2005

;#define ex(i, u) for(int i = h[u]; i; i = g[i].nxt)

inth[m], dep[m], dis[m][m], n, tot, m, k, root, du[m];

bool

vis[m];

struct edgeg[ m << 2

];void add(int u, int v)

void bfs(int

st) }

}}int

tl;void dfs(intu)}

int work(int now, int

len)

return

ans;

}bool check(int

mid)

intmain()

for(int i = 1; i <= n; i++)

if(du[i] > 2

)

if(!root)

for(int i = 1; i <= n; i++)bfs(i);

int lf = 1, rg =n;

while(lf <=rg)

printf(

"%d\n

", ans);

}

view code

暑假第二十六測

今天又考的奇差 題解 第一題 這麼簡單一道題我想了好久,智商實在是下線了 includeusing namespace std intmain view code 第二題 我們發現e的長度很小,我們可以在上面做文章,其實每個位置對應的 strlen e 都是一樣的 我們用樹狀陣列維護rt pos l...

2017 8 23暑假集訓第二十四天

今天一共a了兩道題 1001.1002 比較簡單的?1001做了一上午 一直在繞一點 當輸入字元m後,要輸入五個數字 用scanf輸入的 但是!卻只寫了四個 d!然後就一直在找bug!找了一上午。我很疑惑,為什麼編譯能過!提交還是莫名其妙的wa!一直在懷疑自己!下午 睡過頭了 來的晚了 1007看了...

第二十章 Skeletal Animation

skeletal animation 骨骼動畫 是指互相連線的變換 骨頭 組成的分層集合,以及對應的模型mesh 即骨骼的 當這些變換隨著時間變化而變化時,模型的mesh就會形成動畫效果。本章,我們將會 skeketal animation,並開發一些系統用於支援模型動畫。把乙個skeleton對映...