POJ2566(尺取法 字首和)

2021-08-26 20:41:07 字數 904 閱讀 4179

題意:給出乙個整數列,求一段子串行之和最接近所給出的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...