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個讚,小明就認為這個帖子曾是 熱帖 具體來說,如果存在某個時刻...