题目链接
CF46B T-shirts from Sponsor - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
某著名比赛的知名赞助商决定给比赛的每个参赛者一件T恤作为礼物。
现在出现了一个问题:一方面,目前尚不清楚应该订购什么尺码的T恤,另一方面,他不想订购太多的T恤。经过大量的脑力训练和一些预估,赞助商订购了一定数量的尺寸为S,M,L,XL和XXL的T恤。T恤最终带来了好运,在比赛那天有一排参与者都想得到一件。
每个参赛者都以Ta期望的T恤尺码为特征(尺寸S,M,L,XL和XXL之一)。参与者一个接一个地拿到T恤。
如果还有适合的尺寸的T恤,那么Ta就会拿走它。否则,参赛者会选择尺寸尽可能接近最佳尺寸的T恤(相邻尺码之间的距离等于1)。如果有多种可供选择,参赛者将选择更大尺寸的T恤。例如,对于最佳大小为L的人,首选项列表如下所示:L,XL,M,XXL,S。
输入格式
第一行是5个不超过1000的非负数NS,NM,NL,NXL,NXXL 为买入数
第二行是K,代表参赛人数
第三行是每人的尺码
NS+NM+NL+NXL+NXXL>=K
输出格式:
一行,每个参赛者获得的衣服的尺码数
输入输出样例
输入 #1
1 0 2 0 1 3 XL XXL M输出 #1
XXL L L
思路
最合适的肯定是每个人自己的尺码,但是每个人自己的尺码没有了之后,就是优先选用和自己的尺码最接近的码数,如果比自己尺码小的最接近的码数和大的最接近的码数都有,那就优先选用大的。所以也就是一开始找自己的尺码,自己的尺码没有了之和就往两边去找。
代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[5],k,b[1005];
map<string,int> mp;//这里用到了双重map,可以防止通过value找key的麻烦
map<int,string> mp2;
mp["S"]=0;
mp["M"]=1;
mp["L"]=2;
mp["XL"]=3;
mp["XXL"]=4;
mp2[0]="S";
mp2[1]="M";
mp2[2]="L";
mp2[3]="XL";
mp2[4]="XXL";
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
string s;
cin>>s;
int left=mp[s],right=mp[s];//确定开始的位置,也是最合适的码数的位置
while(right<5||left>=0)//往两边找,因为如果没有最合适的码数,参赛者将选择更大尺寸的T恤,所以先是右边
{
if(right<5&&a[right]>0)//记得左右边的情况要分开,不要混到一起
{
cout<<mp2[right]<<endl;
a[right]--;//有人选了这种码数的衣服,数量减一
break;
}
else if(right<5&&a[right]==0)//否则就只是往后边移动,right<5的话,可有可无
{
right++;
}
if(left>=0&&a[left]>0)
{
cout<<mp2[left]<<endl;
a[left]--;
break;
}
else if(left>=0&&a[left]==0)
{
left--;
}
}
}
return 0;
}