其他分享
首页 > 其他分享> > 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;
					}
				}
			}
		}
	}
}

标签:XL,衣服,题解,texttt,尺码,CF46B,shirts,leqslant,XXL
来源: https://www.cnblogs.com/Eason-AC/p/15716986.html