LuoguP7259 [COCI2009-2010#3] SORT 題解
阿新 • • 發佈:2021-12-16
LuoguP7259 [COCI2009-2010#3] SORT 題解
Content
請編寫一個“頻率排序器”。輸入一個
長度為 \(n\) 的數列 \(A=\{a_1,a_2,\dots,a_n\}\),要求:
- 按照每個數的出現次數降序排列。
- 如果兩個數出現次數相同,則誰在數列中出現的位置靠前,排列之後那個書的位置也是靠前的。
資料範圍:\(n\in[1,10^3],1\leqslant a_i\leqslant c\leqslant10^9\)。
Solution
我們開個 \(\texttt{map}\) 陣列 \(vis\) 用來記錄某個數是在數列中第幾個出現的(如果某個數 \(x\) 沒出現則 \(vis_x=0\)),然後再開個結構體儲存:
- 這個數的值。
- 這個數最先出現的位置。
- 這個數出現的次數。
邊輸入就邊記錄以上資訊。但有個例外,如果這個數第一次出現,則在結構體中新開一個元素,記錄當前位置為最先出現的位置,出現次數為 \(1\),數的值為當前讀入的數的值。
以上資訊記錄完以後我們就開始排序了,首先按照數的出現次數為第一關鍵字降序排列,如果次數相同,再按照最先出現的位置為第二關鍵字排序。排序完之後就可以輸出了。
Code
struct node { int fi, ti, num; bool operator < (const node& tmp) const { if(ti != tmp.ti) return ti > tmp.ti; return fi < tmp.fi; } }a[1007]; map<int, int> vis; int n, c, cnt, x[1007]; int main() { n = Rint, c = Rint; F(i, 1, n) { x[i] = Rint; if(!vis[x[i]]) { a[++cnt] = (node){i, 1, x[i]}; vis[x[i]] = cnt; } else a[vis[x[i]]].ti++; } sort(a + 1, a + cnt + 1); F(i, 1, cnt) F(j, 1, a[i].ti) printf("%d ", a[i].num); return 0; }