[問題] HackerRank - 陣列的相關問題

看板C_and_CPP作者 (Linus)時間6年前 (2018/01/05 21:09), 編輯推噓2(2011)
留言13則, 4人參與, 6年前最新討論串1/1
題目: 輸入N與M,N表示陣列個數,M表示操作次數。陣列初始值為0。 操作內容為輸入a, b, k。a代表第a個元素,b代表第b個元素。 將a至b的元素(包含a, b兩個位置的元素)加上整數k。 最後找出陣列元素中最大值。 Sample Input: 5 3 1 2 100 2 5 100 3 4 100 表示N=5, M=3, 所以代表陣列元素有五個,操作次數為三,所以有以下三行操作 第一次操作: a=1, b=2, k=100 第二次操作: a=2, b=5, k=100 第三次操作: a=3, b=4, k=100 Sample Output: 200 Explanation: 第一次操作: 100 100 0 0 0. 第二次操作: 100 200 100 100 100. 第三次操作: 100 200 200 200 100. 所以最大值為 200. Solution: #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { long int N,K,p,q,sum,i,j,max=0,x=0; cin>>N>>K; long int *a=new long int[N+1](); for(i=0;i<K;i++) { cin>>p>>q>>sum; a[p]+=sum; if((q+1)<=N) a[q+1]-=sum; } for(i=1;i<=N;i++) { x=x+a[i]; if(max<x) max=x; } cout<<max; return 0; } 小弟資質愚鈍,一直不懂這個解答的邏輯與演算法, 坦白說思考了兩天,還是看不太懂QQ 請問有哪位大大懂程式碼的想法是什麼嗎? 感激不盡!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.24.39 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1515157763.A.C4A.html

01/05 21:17, 6年前 , 1F
考慮數列與前綴和的關係
01/05 21:17, 1F

01/05 21:21, 6年前 , 2F
演算法筆記 Sequence2 最後面
01/05 21:21, 2F

01/05 22:42, 6年前 , 3F
Sylveon大大,請問有網址嗎?
01/05 22:42, 3F

01/05 23:00, 6年前 , 4F
請問一下所以第一個for迴圈代表的是把三個序列做微分?
01/05 23:00, 4F

01/05 23:09, 6年前 , 5F
我只是直覺的想到,從第幾個到第幾個加多少而已..
01/05 23:09, 5F

01/05 23:17, 6年前 , 6F
fishinair大大,我一開始也是這樣寫的...哈哈
01/05 23:17, 6F

01/06 03:56, 6年前 , 7F
我在某個比賽出過一樣的題目xd,你可以考慮只有一個操作
01/06 03:56, 7F

01/06 03:57, 6年前 , 8F
時,把原來數列ai加上k,然後做前綴和(第二個for)的話,
01/06 03:57, 8F

01/06 03:57, 6年前 , 9F
效果就是Si以後的所有項都加上k,因此再用-k吧不要加的
01/06 03:57, 9F

01/06 03:57, 6年前 , 10F
部分抵銷
01/06 03:57, 10F

01/06 07:44, 6年前 , 11F
我是想像成unit step function的疊合,感覺比較視覺化
01/06 07:44, 11F

01/06 07:49, 6年前 , 12F
把題目想像成產生方波,然後方波的疊合這樣子
01/06 07:49, 12F

01/06 22:57, 6年前 , 13F
感謝各位大大的回答,小弟好像對這解法有fu了~
01/06 22:57, 13F
文章代碼(AID): #1QJta3nA (C_and_CPP)