日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3572 [POI2014]PTA-Little Bird

發(fā)布時(shí)間:2025/4/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3572 [POI2014]PTA-Little Bird 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P3572 [POI2014]PTA-Little Bird

一只鳥從1跳到n。從1開始,跳到比當(dāng)前矮的不消耗體力,否則消耗一點(diǎn)體力,每次詢問有一個(gè)步伐限制k,求每次最少耗費(fèi)多少體力


很簡(jiǎn)短的題目哼。

首先對(duì)于一個(gè)點(diǎn), 他的狀態(tài)一定是由前 \(k\) 個(gè)轉(zhuǎn)移過來的。 \(k\) 的長度在每組詢問內(nèi)一定, 想到用單調(diào)隊(duì)列維護(hù) \(dp\)

不過此時(shí)單調(diào)隊(duì)列里的元素有兩個(gè)關(guān)鍵字: 勞累度和高度, 因?yàn)樘奖冗@個(gè)點(diǎn)高的樹需要花費(fèi)恒為一點(diǎn)體力(這個(gè)很重要), 所以我們維護(hù)單調(diào)隊(duì)列的時(shí)候可以以勞累度為第一關(guān)鍵字, 高度為第二關(guān)鍵字進(jìn)行比較, 為多個(gè)關(guān)鍵字的單調(diào)隊(duì)列

解釋一下為什么體力花費(fèi)恒為一點(diǎn)很重要。 這里運(yùn)用了一點(diǎn)貪心的思想: 此題的高度對(duì)體力消耗沒有影響, 只有高和矮兩種說法。 只要我的勞累值比你小, 不管你的高度有多低, 我 $ + 1$ 一定 \(<=\) 你, 所以可以把高度作為第二關(guān)鍵字比較, 從而不影響結(jié)果

Code

教訓(xùn): 多次調(diào)用簡(jiǎn)單函數(shù)會(huì)大大降低算法的效率, 開一波 \(O2\) 才沒 \(T\)

// luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #define LL long long using namespace std; int RD(){int flag = 1, out = 0;char c = getchar();while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}return flag * out;} const int maxn = 1000019; int len, num ,k; int h[maxn]; int dp[maxn]; struct Que{int h, val, index;Que (int h, int val, int index): h(h), val(val), index(index){}Que(){};bool operator < (Que const &a)const{if(val != a.val)return val < a.val;return h > a.h;}}Q[maxn]; int head, tail; void push_back(Que x){while(head <= tail && x < Q[tail])tail--;Q[++tail] = x;} void check(int x){while(x - Q[head].index > k)head++;} int get_min(){return Q[head].val;} int main(){len = RD();for(int i = 1;i <= len;i++)h[i] = RD();num = RD();while(num--){k = RD();head = 1, tail = 0;Q[head] = Que(1e9 + 19, 0, 0);memset(dp, 0, sizeof(dp));for(int i = 1;i <= len;i++){check(i);if(h[i] < Q[head].h)dp[i] = get_min();else dp[i] = get_min() + 1;push_back(Que(h[i], dp[i], i));}printf("%d\n", dp[len]);}return 0;}

轉(zhuǎn)載于:https://www.cnblogs.com/Tony-Double-Sky/p/9339048.html

總結(jié)

以上是生活随笔為你收集整理的P3572 [POI2014]PTA-Little Bird的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。