CF46B T-shirts from Sponsor

题目链接

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值