1 条题解
-
1
书接上回http://10.131.7.177/p/P1102
游客在购买门票时必须说明两个数字,x 和 y,代表他要看展览中的第 x 幅至第 y 幅画(包含 x,y)之间的所有图画,而门票的价钱就是一张图画一元。
Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。 请求出他购买门票时应选择的 x,y,数据保证一定有解。 若存在多组解,输出 x 最小的那组。
题意分析 我们要得到一个区间的两个端点,这个区间出现的数字是1-m至少出现一次 从第二段可看出贪心 使用双指针,左闭右开,表示为[l,r),参观画的作者为 考虑贪心策略:固定左指针,右指针向右延伸 sum代表画的数量,num代表画家人数 如果全部可以看到,去除最左边的话,左指针向右 ,右指针也得向右
代码部分
#include<iostream> using namespace std; #define MAXN 1000010 int n,m,l,r,sum[2005],a[MAXN]; int ans,ansl,ansr,num; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } l=1,r=1,num=0,ans=MAXN; while(l<=r && r<=n+1){ if(num<m){ r++; sum[a[r-1]]++; if(sum[a[r-1]]==1) num++; }else{ if(ans>r-l){ ans=r-l; ansl=l; ansr=r-1; } sum[a[l]]--; if(sum[a[l]]==0) num--; l++; } } cout<<ansl<<" "<<ansr; return 0; }双指针本身就是一个队列。
学会后自己尝试做http://10.131.7.177/p/P1115
- 1
信息
- ID
- 5749
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 15
- 已通过
- 9
- 上传者