无奈,二十行代码看了几个小时。。 还不知道理解的对不对。。真完蛋。。
思路:
仔细想想,感觉难在怎么建立数据结构,存取状态。。
用set来保存状态,set<pair<int,int>> A,B,其中A.first保存的是数字的值,sceond保存的是数字位置。
set<pii> B的first保存的是要求的最小组数,second保存的是位置。
最主要的还是dp的思想,从前一最优状态求现在的最优状态
上代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits> 11 #include<string.h> 12 #include<numeric> 13 #include<cmath> 14 #include<stdlib.h> 15 #include<vector> 16 #include<stack> 17 #include<set> 18 #define FOR(x, b, e) for(int x=b;x<=(e);x++) 19 #define REP(x, n) for(int x=0;x<(n);x++) 20 #define mp make_pair 21 #define INF 1e7 22 #define MAXN 100010 23 #define maxn 1000010 24 #define Mod 1000007 25 #define N 1010 26 using namespace std; 27 typedef long long LL; 28 29 set<pair<int,int> > sa,sb; 30 int dp[MAXN],a[MAXN]; 31 int n, x, s, l; 32 int main() 33 { 34 cin >> n >> s >> l; 35 FOR(i, 1, n) cin >> a[i]; 36 dp[0] = 0; 37 FOR(i, 1, n) { 38 //每次加入一个数字 39 sa.insert(mp(a[i],i)); 40 //第i位置,若不符合题意,则删去当前位置最左端的状态、数字 41 while (sa.rbegin()->first - sa.begin()->first > s) { 42 sb.erase(mp(dp[x],x)); 43 x++; 44 sa.erase(mp(a[x],x)); 45 } 46 //满足要求的话,作为有效状态加入集合sb中 47 if (i >= l && sa.size() >= l && dp[i-l] >= 0) 48 sb.insert(mp(dp[i-l],i - l)); 49 if (sb.empty()) 50 dp[i] = -1; 51 else 52 dp[i] = sb.begin()->first + 1; 53 } 54 cout << dp[n] << endl; 55 return 0; 56 }
时间: 2024-11-08 10:09:18