問題描述
小 f 很愛打怪, 今天因為系統 bug, 他提前得知了 n 只怪的出現順序以及擊
倒每只怪得到的成就值 ai。 設第一只怪出現的時間為第 1 秒,這個遊戲每過 1 秒
鐘出現乙隻新怪且沒被擊倒的舊怪消失。 小 f 決定發動一次技能, 他的技能最多
維持 k 秒, 他希望獲得最大的成就值,請你幫他計算他發動技能的時間 l 和技能
結束時間 r(r-l+1<=k)。 當存在多種方案使得成就值最大時,選擇技能發動時間 l
最小的方案, 再選擇技能持續時間 r-l+1 最小的方案。
★資料輸入
輸入第一行為兩個正整數 n(1<=n<=100000), k(0,表示出現 n 只怪,
小 f 的技能最多維持 k 秒。
輸入第二行為 n 個整數,表示小 f 擊倒第 i 秒鐘出現的怪能給有獲得的成就
值 ai(-1000<=a[i]<=1000)。
★資料輸出
輸出為一行三個數。第乙個數為可獲得的最大成就值,第二個數為技能發動
時間 l,第三個數為技能結束時間 r。
輸入示例
輸出示例
6 3-1 2 -6 5 -5 6
6 4 6
輸入示例
輸出示例
5 5-1 -1 -1 -1 -1
-1 1 1
思路雙端佇列
code
1 #include 2 #include 34struct
node5;
910intmain()
1122
23int max_l = 1, max_r = 1, max_hap = p[1
];24 node *que = (node *)malloc(sizeof(node)*(n+1
));25
int l=0,r=0
;26 que[r].data = p[0
];27 que[r].index = 0;28
29for (i = 1; i <= n; i++)
3035
36int val = p[i] -que[l].data;
37if (val >max_hap)
3843
44while (l<=r && p[i]4548 r++;
49 que[r].data =p[i];
50 que[r].index =i;51}
52 printf("
%d %d %d\n
", max_hap, max_l, max_r);
5354
free
(p);
55free
(que);
5657
return0;
58 }
資料結構小總結
線性表是一種典型的線性結構。頭結點無前驅有乙個後繼,尾節點無後繼有乙個前驅。鍊錶只能順序查詢,定位乙個元素的時間為o n 刪除乙個元素的時間為o 1 線性表的順序儲存結構 把線性表的結點按邏輯順序依次存放在一組位址連續的儲存單元裡。用這種方法儲存的線性表簡稱順序表。是一種隨機訪問的儲存結構。順序儲存...
資料結構之小演算法
1 給定乙個整數n,那麼n的階乘n!末尾有多少個0呢?例如 n 10,n!3 628 800,n!的末尾有兩個0。int zeronumber int num return ret int main return count 3 查詢乙個字串中第乙個只出現兩次的字元。比如 abcdefabcdefa...
資料結構小知識點
1,鍊錶專業術語 首節點 第乙個有效節點 尾節點 最後乙個有效節點 頭結點 第乙個有效節點之前的那個節點,頭結點並不存放有效資料,加頭結點的目的主要是為了方便對鍊錶的操作 頭指標 指向頭結點的指標變數 尾指標 指向尾節點的指標變數 2,棧的分類 靜態棧 用陣列實現 動態棧 用鍊錶實現 3,迴圈佇列 ...