CodeVS P2963 卡片整理

2021-07-07 09:26:20 字數 1685 閱讀 5767

題目描述 description

小明有n張卡片,每張卡片都有乙個編號ai(ai>0),但是這n張卡片中有一些編號是重複的,他想把重複的只留下一張,其餘的扔掉,統計出剩下的卡片數,並且把它們按編號從小到大排好,但卡片數量不少,比較繁瑣,想請你幫忙用程式設計來解決問題。

輸入描述 input description

兩行。第一行為乙個正整數n,表示原來卡片總數。第二行是n個整數,任何兩個數之間用乙個空格分隔,表示卡片的編號(都是正整數)。

輸出描述 output description

兩行。第一行乙個正整數,表示去掉重複卡片之後剩餘編號各不相同的卡片數量。第二行是這些剩餘卡片從小到大排列的卡片編號。

樣例輸入 sample input

8 8 5 5 1 6 7 6 8

樣例輸出 sample output

5 1 5 6 7 8

資料範圍及提示 data size & hint

n<=10000

ai<=10000

基礎題,很容易想到排序和去重,先去重可以減少參與排序 資料量,但是要考慮去重帶來的預處理開銷。實際上,對原始資料排序後,重複元素是連續 ,只要在輸出時加以區分也可以達到輸出去重的目的。

關於排序的演算法,我們常用簡單排序有基於選擇的選擇排序和基於交換的氣泡排序

#include

void bubblesort(int nums,int num)}}

}int main()

printf("%d\n",--j);

for(i = 1;i <= j;i++)

printf("%d ",b[i]);

return

0;}

void selectionsort(int nums,int num)

if(k != i)

}}int main()

演算法分析:無論是選擇排序還是氣泡排序,外層迴圈均為n-1,內層迴圈均為n-i,所以演算法複雜度均為o(n^2)。下面介紹一種複雜度較低的排序演算法。

快速排序實際上也是基於比較的,但是它採用了演算法設計中經典的分治思想,即每次將待排序列分割為兩個子串行,然後遞迴的呼叫,分別對兩個子串行做快速排序。

排序過程:

在待排序列中選擇乙個數作為基準數用於比較,由於這個數是任意的,所以方便起見一般以第乙個數作為基準數;

交換,以該數為基準將序列分為兩部分,左邊序列中的數都小於該數,右邊序列中的樹都大於該數

遞迴呼叫,分別對兩個子串行做快速排序

#include

void quicksort(int nums,int left,int right)

nums[i] = temp;

quicksort(nums,i+1,right);

quicksort(nums,left,i - 1);

}else

return;

} int main()

演算法分析:我們發現,快速排序從本質上說期望每次排序後將待排序列分成相等長度的兩部分,那麼最終遞迴呼叫的次數為log2n,此時演算法複雜度為o(n*log2n),遠低於o(n^2)。然而這是理想狀態下的結果。快速排序的效率取決於原序列的有序程度,最壞情況下,若原序列已經有序,則每次快速排序只能將原序列分割為0和n-1長度兩個序列,此時遞迴地用需要n-1次,複雜度回到了o(n^2)。

296 晶元測試

題目描述 有n塊晶元,有好有壞,已知好晶元比壞晶元多。每個晶元都能用來測試其他晶元。用好晶元測試其他晶元時,能正確給出被測試晶元是好還是壞。而用壞晶元測試其他晶元時,會隨機給出好或是壞的測試結果 即此結果與被測試晶元實際的好壞無關 給出所有晶元的測試結果,問哪些晶元是好晶元。輸入描述 輸入資料第一行...

建立vue專案(2 9 6)

檢視vue版本 vue version 2.9.6 node v v15.0.1win x管理員開啟powershell 建議管理員身份啟動,不然容易報錯,ps vscode和webstrom等終端預設是user身份啟動。所以,建議還是用powershell建立vue專案 cd vue init w...

解除安裝 vue 2 9 6 失敗

我是想安裝一下vue的穩定版本,因為3.x還沒開始學,結果用npm 解除安裝不了總是不成功。1.參考部落格 mac 公升級 vue 3.x 之前解除安裝 vue 2.9.6 失敗的原因和解決方法 寫得很詳細,也跟我的情況相似,但是細看有差別。我的vue肯定是安裝nvm之後用npm安裝的,usr lo...