題目大意
排隊時有人插隊。
輸入格式
給定佇列長度 $n$ 。
接下來 $n$ 行每行兩個正整數,第一個表示該元素插入位置,另一個表示該元素的權值。
輸出格式
按照順序輸出該位置元素的權值。
注意事項
- 輸入的資料組數未知,需要一直輸入,輸入方法可以參考以下程式碼。
while (cin>>n){
//操作
}
- 由樣例可知,排隊的位置從 $0$ 開始。
解析
首先要解決這道題第一個問題便是關於插隊的處理。
這個人插入到隊伍的 $i$ 位置,那麼 $i$ 位置後的人的位置都要向後移 $1$ 位。
關於解決這個問題這裡有兩種方法:
- 上篇題解 @ fangminding 大佬的方法:使用 vector 容器中的 insert 函式,具體用法這裡不過多贅述,感興趣的可以去看他的題解。
- 本蒟蒻使用的樸素演算法,具體解釋在程式碼裡:
void charu(int a,int b){
int t=arr[a];//儲存在 a 位置原來的元素權值
arr[a]=b; //將其替換為現在插入的元素權值
for(int i=a+1;i<n;i++){//從第 a+1 位開始往後推移
int t1=arr[i];//儲存第i位的元素權值
arr[i]=t; //將第 i 位改為上一位的元素權值
t=t1;//將 t 更新
}
}
怎麼樣,是不是很樸素?凸顯蒟蒻之菜
解決了這個問題接下來就很簡單了:
邊插入我們邊處理,如果該位置沒有人,那肯定最好,直接插入就行,如果有人,那就是上面插隊的情況了。
最後附上完整程式碼:
#include<iostream>
#include<cstring>
using namespace std;
int arr[200005];
int n;
void charu(int a,int b){
int t=arr[a];//儲存在 a 位置原來的元素權值
arr[a]=b; //將其替換為現在插入的元素權值
for(int i=a+1;i<n;i++){//從第 a+1 位開始往後推移
int t1=arr[i];//儲存第 i 位的元素權值
arr[i]=t; //將第 i 位改為上一位的元素權值
t=t1;//將t更新
}
}
int main(){
while(cin>>n){
memset(arr,0,sizeof arr);
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
if(arr[a]==0){//沒有人
arr[a]=b;
}else{ //插隊
charu(a,b);
}
}
for(int i=0;i<n;i++){
cout<<arr[i]<<' ';
}
cout<<endl;//如果你第一個點 wa ,那麼可能就是你這裡沒換行
}
return 0;
}
最後,這是本蒟蒻的第一篇公開題解,稽核辛苦了!望透過,若有錯誤,打下來一點整改!
蒟蒻也想弱弱的說一句:點個讚唄 $qwq$ 。