codeforces 616D

本文介绍了一种使用滑动窗口解决特定类型问题的方法。通过调整窗口大小来找到符合条件的最大区间,确保区间内的不同数值数量不超过给定限制k。文章包含完整的C++代码实现,并附带了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你n个数,找出一个最大的区间,满足:不同的数值个数不超过k;

    //我开始又看错题了、 以为是找出一个最大区间,里面的数的最大值不超过k;

思路:利用一个窗口滑动,左端点表示当前位置,右端点表示目前这段数列符合要求, 每增加一个长度,判断是否合理,不然平移左端点。                         思路来自:http://blog.youkuaiyun.com/u011528035/article/details/50521870#;

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 const int qq=1e6;
 6 int num[qq];
 7 int dp[qq];
 8 int l,r,k,n,ans,dif,p,q;    //定义的全局变量自动初始化为0(包括数组). 
 9 int main()
10 {
11     cin >> n >> k;
12     l=r=1;
13     for(int i=1;i<=n;++i){
14         cin >> num[i];
15         if(!dp[num[i]])    ++dif;
16         dp[num[i]]++;
17         r=i;
18         if(dif>k){
19             for(int j=l;j<=r;++j){
20                 dp[num[j]]--;
21                 if(!dp[num[j]]){
22                     dif--;l=j+1;break;
23                 }
24             }
25         }
26         if(r-l+1>ans){
27             ans=r-l+1;q=l;p=r;
28         }
29     }
30     cout << q << " " << p << endl;
31 }

 

转载于:https://www.cnblogs.com/sasuke-/p/5133471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值