玩具(BZOJ-1307)
Problem Description
小球球是個可愛的孩子,他喜歡玩具,另外小球球有個大大的柜子,里面放滿了玩具,由于柜子太高了,每天小球球都會讓媽媽從柜子上拿一些玩具放在地板上讓小球球玩。 這天,小球球把所有的N輛玩具擺成一排放在地上,對于每輛玩具i,小球球都會給它涂上一個正整數(shù)value[i],以表示小球球?qū)υ撏婢叩南矏鄢潭?#xff0c;value[i]越小則表示他越喜愛。當(dāng)然對于兩輛不同的玩具u,v(u<>v),亦有可能value[i]=value[j],也就是說小球球?qū),v兩車的喜愛程度是一樣的。 小球球很貪玩,他希望能從中間某個位置,連續(xù)的取出k輛玩具,使得這k輛車?yán)锵矏鄢潭茸畲蟮囊惠v車的喜愛程度正好等于k,且這k輛車中沒有兩輛車的喜愛程度是相同的。小球球希望知道k的最大值為多少。
Input
第一行一個整數(shù)N,表示小球球擁有的玩具數(shù)量。 接下來N行,每行一個整數(shù),表示value[i]。
Output
一個整數(shù)k,即答案。
Sample Input
6
2
4
1
3
2
1
Sample Output
4
思路:
題目實質(zhì)就是給出一個 n 個數(shù)的序列,要求從某一位置開始取 k 個,要求這 k 個數(shù)的大小滿足從 1~k,問 k 的最大值
首先,k 最小一定為 1,其次,這 k 個數(shù)是連續(xù)的,也即當(dāng)一個數(shù)滿足 1,2,...,k 時,才能更新 k 的最大值,因此可以先找到所有 1 的位置,在每個 1 到左右兩個 1 的區(qū)間里掃描,然后進(jìn)行判重統(tǒng)計即可
Source Program
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<deque> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-6 #define INF 0x3f3f3f3f #define N 2000001 #define LL long long const int MOD=998244353; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; using namespace std; int a[N]; int pos[N];//記錄1的位置 int bucket[N];//用于判重的桶 int main(){int n;scanf("%d",&n);int numOne=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==1){numOne++;pos[numOne]=i;}}//兩端點最外也視為1pos[0]=0;pos[numOne+1]=n+1;int maxx=0;int cnt=0;//選擇的個數(shù)int k;queue<int> order;//已選擇的玩具,按順序選擇priority_queue<int> increasing;//已選擇的玩具,保證是單調(diào)遞增的for(int i=1;i<=numOne;i++){if(pos[i+1]-1-pos[i-1]>maxx){//兩個1之間數(shù)的個數(shù)for(int j=pos[i+1]-1;j>pos[i-1];j--){//遍歷兩個1之間的數(shù)if(bucket[a[j]]==0){//沒有被選擇bucket[a[j]]=1;//選擇cnt++;//選擇的個數(shù)increasing.push(a[j]);//加入單調(diào)遞增的隊列order.push(a[j]);//加入順序選擇的隊列}else{//已被選擇while(order.front()!=a[j]){//從已被選擇的玩具重新開始選擇while(bucket[increasing.top()]==0)//清空沒有被選擇的increasing.pop();int temp=increasing.top();//按順序選取的元素if(temp==cnt)//選擇的個數(shù)與順序數(shù)相對應(yīng)maxx=max(maxx,temp);//清除已被選擇的玩具k=order.front();order.pop();bucket[k]=0;cnt--;}}}if(cnt!=0){if(bucket[1]==1)//1一定會被選擇,只有當(dāng)其被選擇時,找最大值才有意義if(increasing.top()==cnt)maxx=max(maxx,increasing.top());while(!order.empty()){//清空隊列k=order.front();bucket[k]=0;cnt--;order.pop();}while(!increasing.empty())//清空隊列increasing.pop();}}}printf("%d\n",maxx);return 0; }?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的玩具(BZOJ-1307)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最长配对(51Nod-2494)
- 下一篇: 信息学奥赛一本通(1040:输出绝对值)