P3572 [POI2014]PTA-Little Bird
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\) 的長(zhǎng)度在每組詢問內(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程编程实战指南+设计模式篇p
- 下一篇: 设计模式6+1大原则