題解:P10688 Buy Tickets

sunshine_o發表於2024-08-16

題目大意

排隊時有人插隊。

輸入格式

給定佇列長度 $n$ 。
接下來 $n$ 行每行兩個正整數,第一個表示該元素插入位置,另一個表示該元素的權值。

輸出格式

按照順序輸出該位置元素的權值。

注意事項

  • 輸入的資料組數未知,需要一直輸入,輸入方法可以參考以下程式碼。
while (cin>>n){
    //操作
}
  • 由樣例可知,排隊的位置從 $0$ 開始。

解析

首先要解決這道題第一個問題便是關於插隊的處理。
這個人插入到隊伍的 $i$ 位置,那麼 $i$ 位置後的人的位置都要向後移 $1$ 位。
關於解決這個問題這裡有兩種方法:

  1. 上篇題解 @ fangminding 大佬的方法:使用 vector 容器中的 insert 函式,具體用法這裡不過多贅述,感興趣的可以去看他的題解。
  2. 本蒟蒻使用的樸素演算法,具體解釋在程式碼裡:
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$ 。

相關文章