1. 程式人生 > 其它 >CF46B T-shirts from Sponsor 題解

CF46B T-shirts from Sponsor 題解

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;
					}
				}
			}
		}
	}
}