ACM_买粽子
Posted acgoto
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM_买粽子相关的知识,希望对你有一定的参考价值。
买粽子
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
端午节快到了,小蛋准备到集市上买粽子。于是周六这天,小蛋和舍友搭着公交到了西南市场。说来也怪,这天集市上就只有n个人在卖粽子,整齐地排成一列,而且第i(1<=i<=n)个人前面有Xi个粽子堆在一起。小蛋这人平时很大方,买东西也很讲究,这次就想自掏腰包,准备买很多粽子送给同学和老师们吃。那么问题来了,有n个人在卖粽子,怎么个买法呢?小蛋就想在n个人中连续地选择k个相邻的人买他们全部的粽子,要求所选的这k个连续相邻的人各自卖的粽子数量不能有相同的个数,并且使得k最大。
Input:
输入有多组数据 第一行输入一个整数n(0<n<=100000),表示集市上有n个人在卖粽子。 第二行输入n个整数,第i个数表示第i个人卖的粽子数量Xi(0 < Xi <= 1000)。
Output:
输出符合条件的最大值k,每个输出占一行
Sample Input:
7 3 2 4 1 3 2 3 5 1 6 3 1 2
Sample Output:
4 4
解题思路:找到一个最长的子序列,使得里面的元素都不相同。set容器维护,时间复杂度是O(nlog(n))。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 int n,x[maxn],l,r,ans; 5 int main(){ 6 while(~scanf("%d",&n)){ 7 for(int i=0;i<n;++i)scanf("%d",&x[i]); 8 set<int> st;l=r=ans=0; 9 while(r<n){ 10 while(r<n&&!st.count(x[r]))st.insert(x[r++]); 11 ans=max(ans,r-l); 12 st.erase(x[l++]); 13 } 14 printf("%d ",ans); 15 } 16 return 0; 17 }
以上是关于ACM_买粽子的主要内容,如果未能解决你的问题,请参考以下文章