1. 程式人生 > 其它 >LuoguP7259 [COCI2009-2010#3] SORT 題解

LuoguP7259 [COCI2009-2010#3] SORT 題解

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;
}