【每日一题】8月17日题目精讲-[SCOI2009]生日礼物
生活随笔
收集整理的這篇文章主要介紹了
【每日一题】8月17日题目精讲-[SCOI2009]生日礼物
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
來源:牛客網(wǎng):
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld題目描述
小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有N個,分為K種。簡單的說,可以將彩帶考慮為x軸,每一個彩珠有一個對應的坐標(即位置)。某些坐標上可以沒有彩珠,但多個彩珠也可以出現(xiàn)在同一個位置上。
小布生日快到了,于是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮,小西希望這一段彩帶中能包含所有種類的彩珠。同時,為了方便,小西希望這段彩帶盡可能短,你能幫助小西計算這個最短的長度么?彩帶的長度即為彩帶開始位置到結(jié)束位置的位置差。
輸入描述:
第一行包含兩個整數(shù)N, K,分別表示彩珠的總數(shù)以及種類數(shù)。
接下來K行,每行第一個數(shù)為Ti,表示第i種彩珠的數(shù)目。接下來按升序給出Ti個非負整數(shù),為這Ti個彩珠分別出現(xiàn)的位置。
輸出描述:
應包含一行,為最短彩帶長度。
示例1
輸入
復制
輸出
復制
備注:
題解:
雙指針,尺取法
先固定左界為1,然后移動右界,當范圍內(nèi)達到要求的彩珠數(shù)量時,固定右屆開始移動左界,直到范圍內(nèi)不再包含所有顏色的彩珠,不斷更新最小范圍
詳細可以看代碼
不過代碼有錯誤。。。我還沒發(fā)現(xiàn)。。。。
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn=1100045; struct node{ll col;//顏色 ll xy;//坐標 bool operator <(const node tmp)const{return this->xy<tmp.xy;} }a[maxn]; long long cnt[maxn]; signed main() {ll n,k;cin>>n>>k;ll ant=0;for(int i=1;i<=k;i++){ll x;cin>>x;for(int i=1;i<=x;i++){int y;cin>>y;a[++ant].col=i;a[ant].xy=y;}}sort(a+1,a+1+ant);ll l=1,r=maxn;ll sum=1e9+10;ll tmp;ll res=0;//所選不同顏色彩珠的數(shù)量 for(int i=1;i<=ant;i++)//從頭開始枚舉每一個彩珠 {if(cnt[a[i].col]==0)//說明這個顏色還么選res++; cnt[a[i].col]++;//加上當前彩珠while(res==k)//當數(shù)量足夠時 {tmp=a[i].xy-a[l].xy; sum=min(sum,tmp);//記錄最小距離 //-------接下來開始縮小范圍//左邊界開始向右靠,縮小邊界cnt[a[l].col]--;//將左邊界l的彩珠去掉 if(cnt[a[l].col]==0)res--; l++;//向右靠 } }cout<<sum<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的【每日一题】8月17日题目精讲-[SCOI2009]生日礼物的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 良辰美景奈何天赏心乐事谁家院是什么意思
- 下一篇: 【每日一题】8月25日题目精讲 XOR-