CF46B T-shirts from Sponsor 題解
阿新 • • 發佈:2021-12-21
CF46B T-shirts from Sponsor 題解
Content
有一家服裝店,有 \(\texttt{S}\) 碼的衣服 \(n_S\) 件、\(\texttt{M}\) 碼的衣服 \(n_M\) 件,\(\texttt{L}\) 碼的衣服 \(n_L\) 件,\(\texttt{XL}\) 碼的衣服 \(n_{XL}\) 件,\(\texttt{XXL}\) 碼的衣服 \(n_{XXL}\) 件。
有 \(k\) 個人依次進來買衣服,每個人都有自己期望的尺碼。如果服裝店裡面剛好有這個尺碼的衣服,TA 就會拿上這件衣服離開,否則 TA 會選擇儘可能接近自己的期望尺碼的衣服(如果在這樣的情況下有多種選擇,則選擇尺碼較大的)。求這 \(k\) 個人最後各拿了什麼尺碼的衣服。
資料範圍:\(1\leqslant n_S,n_M,n_L,n_{XL},n_{XXL}\leqslant 1000,1\leqslant k\leqslant n_S+n_M+n_L+n_{XL}+n_{XXL}\leqslant 1000\)。
Solution
這題目模擬就好,就是程式碼稍微長了一些。
我們先看是否有每個人的期望尺碼的衣服,如果有那就直接選擇,否則分別向大尺碼和小尺碼依次遍歷,大尺碼先遍歷到就選擇大尺碼,小尺碼先遍歷到就選擇小尺碼。因為資料的特殊性,無需判斷是否有足夠的衣服。
Code
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; int sze[7], k; string str; const string ans[6] = {"", "S", "M", "L", "XL", "XXL"}; int main() { for(int i = 1; i <= 5; ++i) scanf("%d", &sze[i]); scanf("%d", &k); while(k--) { cin >> str; if(str == "S") { if(sze[1]) {puts("S"); sze[1]--;} else { int cur = 1; while(1) { cur = min(5, cur + 1); if(sze[cur]) { cout << ans[cur] << endl; sze[cur]--; break; } } } } else if(str == "M") { if(sze[2]) {puts("M"); sze[2]--;} else { int curl = 2, curr = 2; while(1) { curl = max(1, curl - 1), curr = min(5, curr + 1); if(sze[curr]) { cout << ans[curr] << endl; sze[curr]--; break; } else if(sze[curl]) { cout << ans[curl] << endl; sze[curl]--; break; } } } } else if(str == "L") { if(sze[3]) {puts("L"); sze[3]--;} else { int curl = 3, curr = 3; while(1) { curl = max(1, curl - 1), curr = min(5, curr + 1); if(sze[curr]) { cout << ans[curr] << endl; sze[curr]--; break; } else if(sze[curl]){ cout << ans[curl] << endl; sze[curl]--; break; } } } } else if(str == "XL") { if(sze[4]) {puts("XL"); sze[4]--;} else { int curl = 4, curr = 4; while(1) { curl = max(1, curl - 1), curr = min(5, curr + 1); if(sze[curr]) { cout << ans[curr] << endl; sze[curr]--; break; } else if(sze[curl]) { cout << ans[curl] << endl; sze[curl]--; break; } } } } else if(str == "XXL") { if(sze[5]) {puts("XXL"); sze[5]--;} else { int cur = 5; while(1) { cur = max(1, cur - 1); if(sze[cur]) { cout << ans[cur] << endl; sze[cur]--; break; } } } } } }