# Greedy# Input/Output# Simple Math

f006 - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一系列整數,並輸出其中最大和最小的數。由於 ZeroJudge 網站回傳 500 Server Error,無法得知題目完整描述,但從提供的 AC 程式碼可以推斷出題目意圖。

解題思路

程式碼使用迴圈讀取整數,並使用 maxmin 變數追蹤目前遇到的最大和最小數。初始時,max 設定為 0,min 設定為 10000。迴圈中,如果讀取的數 n 大於 max,則更新 max;如果 n 小於 min,則更新 min。迴圈結束後,輸出 maxmin,中間用空格分隔。程式碼使用了快速輸入輸出優化,例如 getchar_unlocked()putchar_unlocked(),以及編譯器優化標誌。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入的整數個數。程式碼需要遍歷所有輸入的整數一次。
  • 空間複雜度: O(1)。程式碼只使用了幾個固定的變數,不隨輸入大小變化。

程式碼

#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 <iostream>
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[5],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
using namespace std;
int main(){
	int a=read(),n,max(0),min(10000);
	while(a--){
		n=read();
		n>max&&(max=n);
		n<min&&(min=n);
	}
	write(max);
	putchar_unlocked(32);
	write(min);
}

Discussion