最短区间----贪心
C: 最短区间
时间限制: 1 s 内存限制: 128 MB
题目描述
有M种不同颜色的气球(颜色从1至M表示),现在有一排N个位置,需要往这N个位置中填充一些气球,可填也可不填。求最短的区间长度使的这个区间中包含M种颜色的气球。如果没有则输入-1.
输入
第一行输入N和M,N表示位置长度,M表示气球颜色数量。(1≤M
。
第二行输入N个数,第i个数ai表示第i个位置气球的颜色,0表示没填充气球。(0≤ai≤M
输出
输出符合要求的最短区间长度,没有则输入-1。
样例输入
10 6
1 2 3 4 6 3 0 1 2 5
样例输出
7
提示
样例说明:在[4,10]区间,包含1-6,每种颜色都包含并且区间最短。
题解:通过每次比较一个最小区间长度来维护一个[l,i]区间,每次判断区间左值a[l]是否符合局部最优来实现
#include<iostream> #define max 0x3f3f3f3f using namespace std; int a[1000005],vis[1005]; int min(int a,int b) { if(a>b) return b; else return a; } int main() { int n,m,cnt=0,len=max,l=0; cin>>n>>m; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]==0) continue; if(vis[a[i]]==0) cnt++; vis[a[i]]++; while(vis[a[l]]>1||a[l]==0) { vis[a[l]]--; l++; } if(cnt==m) { len=min(len,i-l+1); } } cout<<len<<endl; return 0; }
等风起的那一天,我已准备好一切