題意:給出乙個整數列,求一段子串行之和最接近所給出的t。輸出該段子序列之和及左右端點。
思路:做這道題其實是沒思路的,看了大佬的題解後學習到了。
一般來說,我們必須要保證數列單調性,才能使用尺取法。
預處理出前i個數的字首和,和編號i一起放入pair中,然而根據字首和大小進行排序。由於abs(sum[i]-sum[j])=abs(sum[j]-sum[i]),可以忽視數列字首和的前後關係。此時,sum[r]-sum[l]有單調性。
因此我們可以先比較當前sum[r]-sum[l]與t的差,並更新答案。
如果當前sum[r]-sum[l]同理,如果sum[r]-sum[l]>t,說明和還可以更小,l++。
如果sum[r]-sum[l]=t,必定是最小答案。
由於序列不能為空,即l<>r,如果l==r則r++。
我們更新答案的時候左右區間端點為亂序,輸出的時候調整一下。
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=100005;
const double eps=1e-8;
const double pi = acos(-1.0);
#define p pairll myabs(ll x)
int main()
sort(sum,sum+n+1);
while(k--)
}return 0;
}
poj 2566 字首和 規律進行尺取
傳送門 二分尺取 字首和,需要按一定的規律,不然尺取到一段後,反而縮,就會出現問題,所以需要先記錄每乙個點的編號,然後求字首和,然後進行排序,然後再進行尺取 ac include include include include include define ll long long using na...
POJ 3061 二分 字首和or尺取法
題目鏈結 題目大意 找到最短的序列長度,使得序列元素和大於s。解題思路 兩種思路。一種是二分 字首和。複雜度o nlogn 有點慢。二分列舉序列長度,如果可行,向左找小的,否則向右找大的。字首和預處理之後,可以o 1 內求和。include cstdio include cstring int su...
poj 2100 尺取法連續平方和
題意 給乙個數 n 1e14 求一段連續的數的數字,使得其平方和等於n。輸出的時候,先輸出有多少組,然後每組的開頭輸出有多少個元素,然後輸出這些元素。解析 尺取法。需要注意的地方是s和t要從1開始,否則wa。include include include include include includ...