# Counting Sort# Input/Output Optimization

f282 - 松鼠的願望

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一系列整數,這些整數代表堅果的大小。松鼠只喜歡吃已經排序好的堅果,因此需要將讀取的堅果按照從小到大的順序輸出。

解題思路

這題可以使用計數排序 (Counting Sort) 來解決。由於堅果的大小範圍有限 (0 < n <= 100),我們可以建立一個大小為 101 的陣列 a,用於記錄每個大小的堅果數量。然後,遍歷陣列 a,按照大小順序輸出對應數量的堅果。

程式碼中使用了 getchar_unlocked()putchar_unlocked() 進行輸入輸出優化,以提高程式執行效率。read()write() 函數分別用於快速讀取和輸出整數。

複雜度分析

  • 時間複雜度: O(N + K),其中 N 是輸入的堅果數量,K 是堅果大小的範圍 (100)。
  • 空間複雜度: O(K),其中 K 是堅果大小的範圍 (100)。

程式碼

#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 a[101],b,s;
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	int stk[9],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
	while(b=read())
		++a[b];
	for(int i=1;i<101;++i){
		while(a[i]--){
			if(s)putchar_unlocked(' ');
			write(i);
			s=1;
		}
	}
}

Discussion