題目描述
思路:注意到每個元素都是 x >= 0, 所以該陣列的字首和是遞增的。要找到連續的子串行之和等於k 即找到 sum[i] - sum[j] = k 且 0 <= j < i , 兩重for迴圈會超時,注意到字首和是遞增的,那麼將上式改寫成 sum[i] - k = sum[j] ,這時候只要將字首和對映成下標,這樣只需要一重for迴圈,也就是遍歷sum[i]的時候,只要檢視mp[sum[i] - k] 是否存在,如果存在就存在一組解,且起點是 j+1 終點是 i。
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1e5+7;
typedef
long
long llint;
llint a[maxn]
;llint sum[maxn]
;map
int>mp;
intmain()
else
sum[i]
= sum[i-1]
+ a[i]
; mp[sum[i]
]= i;}if
(sum[n]
< k)
else
}else
if(sum[i]
== k)}}
cout << l <<
" "<< r << endl;
}return0;
}
每日一題 分巧克力
分巧克力 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi wi的方格組成的長方形。為了公平起見,小明需要從這n塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 形狀是正方形,邊長是整數 大小相同 例如一塊 6 5 的巧克力可以...
每日小記之面試寶典(面試題)
所有團隊成員都在單個主幹分支上進行開發。發布時,先考慮使用標籤 tag,如果打標籤不能滿足要求,則從主幹建立發布分支。bug在主幹上修復,然後挑選時機發布到 發布分支上 master 分支中包含的是可以部署到生產環境中的 這一點和 github flow 是相同的 develop 分支中包含的是下個...
一題多解 面試題
最近在其他論壇上看到幾個的面試題,這些天,qq群內的人都在討論怎麼解答才最簡單,下面列出題目 檔案a 檔案b a b c a b c b c a b c a c b a c a b a a a 1 1 1 b b b 2 2 2 c c c 3 3 3 要求合併2個檔案如下 a b c a b c ...