尺取法練習

2021-08-28 08:10:25 字數 1654 閱讀 4460

mr_wolfram 的csdn 部落格 ,

hopeforbetter的csdn部落格,

尺取法顧名思義就像尺子一樣,當測量乙個物體時,你不一定從開始的位置測量,你可以從任意乙個位置st開始,當然前提是尺子夠長,然後你再讀出尾部en的數,尾部減去開始的位置en - st,就是這個物體的長度。尺取法就是這個思想,節約了很多時間。

一般用尺取法的時候判斷以下四點: 

1. 尺取法所用的必須是連續的區間。

2. 尺取法所求的一般是通過對區間的調整來接近或達到某個條件

3. 尺取法的模型便是這樣:根據區間的特徵交替推進左右端點求解問題,其高效的原因在於避免了大量的無效列舉,其區間列舉都是根據區間特徵有方向的列舉,如果胡亂使用尺取法的話會使得列舉量減少,因而很大可能會錯誤,所以關鍵的一步是進行問題的分析!

在使用尺取法時應清楚以下四點:

1、 什麼情況下能使用尺取法?  

2、何時推進區間的端點?

3、如何推進區間的端點?

4、何時結束區間的列舉?

以下是具體事例:

#include#include#include#includeusing namespace std;

#define n 100005

#define inf 10000000

int a[n];

int main()

int st = 0, en = 0;

long long sum = 0;

int ans = inf;

while(1)

if(ans == inf)cout<<0《本題在求解的時陣列不都用,所以用了容器裡面的map,map 函式有個功能,可以向陣列一樣輸入,而且map時,map的預設初始值是0。

#include#include#include#include#include#includeusing namespace std;

#define n 1000010

#define maxn 10000005

#define ll long long

#define inf 0x3f3f3f3f

sets;

int a[n];

int vis[maxn];

int main()

int k = s.size();

int st = 0, en = 0;

int ans = inf, sum = 0;

while(1)

vis[a[en]]++;

en++;

}if(sum < k)break;

ans = min(ans, en-st);

vis[a[st]]--;

if(!vis[a[st]])sum--;

st++;

}printf("%d\n", ans);

return 0;

}

#include#include#include#includeusing namespace std;

#define n 10005

int prime = ;

int main()

else break;}}

cout<}

return 0;

}

演算法 尺取法

我們先來介紹一下尺取法。尺取法,顧名思義,像尺子一樣,一塊一塊的擷取。題目翻譯 給定長度為n的數列整數a0,a1,a2,a3 an 1以及整數s。求出綜合不小於s的連續子串行的長度的最小值。如果解不存在,則輸出0。限制條件 100s 10 8 這裡我們拿第一組測試資料舉例子,即 n 10,s 15,...

尺取法基礎

p1638 逛畫展 題意 求最短區間包含所有畫家。思路 利用兩個變數來維護區間,如果區間不滿足條件r 滿足的話,l 直到區間最小。includeusing namespace std int a 1000005 b 1000005 int main b a l if b a l 0 k l else...

尺取法,藍橋

小明維護著乙個程式設計師論壇。現在他收集了乙份 點讚 日誌,日誌共有n行。其中每一行的格式是 ts id表示在ts時刻編號id的帖子收到乙個 贊 現在小明想統計有哪些帖子曾經是 熱帖 如果乙個帖子曾在任意乙個長度為d的時間段內收到不少於k個讚,小明就認為這個帖子曾是 熱帖 具體來說,如果存在某個時刻...