# Counting# Sorting# Greedy# Array

e973 - 3. 滿意度調查 (Survey of Satisfaction)

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一個數字字串,統計字串中每個數字 (0-9) 出現的次數,然後按照出現次數從大到小排序輸出這些數字。如果出現次數相同,則按照數字大小排序輸出。

解題思路

程式首先建立一個大小為 10 的整數陣列 b,用於儲存每個數字 (0-9) 的出現次數。然後,程式讀取輸入字串,並統計每個數字的出現次數。接著,程式進入一個迴圈,每次找到出現次數最多的數字,並將其輸出,然後將該數字的出現次數設為 0。這個過程重複進行,直到所有數字的出現次數都為 0。

複雜度分析

  • 時間複雜度: O(N + K log K),其中 N 是輸入字串的長度,K 是不同數字的數量 (最多為 10)。統計出現次數需要 O(N) 的時間,排序需要 O(K log K) 的時間。
  • 空間複雜度: O(1),因為程式只使用了一個大小為 10 的固定大小的陣列來儲存數字的出現次數。

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int b[10],mx,i;
char a;
int main(){
	while(a=getchar_unlocked()){
		if(a==-1)break;
		++b[a-48];
	}
	do{
		for(i=9,mx=0;i>=0;--i)
			b[i]>mx&&(mx=b[i]);
		if(!mx)break;
		for(;i<10;++i){
			if(b[i]==mx){
				putchar_unlocked(i+48);
				putchar_unlocked(' ');
				b[i]=0;
				break;
			}
		}
	}while(1);
}

Discussion