f281 - 志樺的亮度
題目描述
題目要求計算照片亮度最少需要增加多少才能讓所有同學的明顯度都不小於給定的亮度值 L。給定 C 個同學的初始明顯度,以及目標亮度 L。如果無論增加多少亮度都無法達到目標,則輸出 "You are too black!"。
解題思路
此題的核心思想是找到班級中明顯度最低的同學(志樺)和第二低的同學。然後,計算將志樺的明顯度提升到 L 所需增加的亮度。如果這個亮度增加量大於將第二低的同學提升到 L 所需的亮度,則表示無法讓所有同學的明顯度都達到 L,輸出 "You are too black!"。否則,輸出志樺需要增加的亮度。
程式碼中,首先讀取同學數量 C 和每個同學的初始明顯度。然後,使用兩個變數 mn 和 mn2 分別追蹤最低和第二低的明顯度。接著,讀取目標亮度 L。最後,計算志樺需要增加的亮度 k = l - mn,並與第二低明顯度同學需要增加的亮度 mn2 - l 進行比較,輸出結果。
複雜度分析
- 時間複雜度: 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 <stdio.h>
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');}
}
int c,l,a,mn=10001,mn2=10001;
int main(){
c=read();
while(c--){
a=read();
if(a<=mn){
mn2=mn;
mn=a;
}
else if(a<mn2)
mn2=a;
}
getchar_unlocked();
l=read();
int k=l-mn;
if(k>mn2-l)
puts("You are too black!");
else{
if(k<=0)
putchar_unlocked('0');
else
write(k);
}
}