问题 G: 果汁店的难题(贪心)

问题 G: 果汁店的难题
时间限制: 1 Sec 内存限制: 128 MB

[提交][状态][讨论版]
题目描述
炎热的夏天,来上一杯现榨的冰爽果汁想想都是一件惬意的事情!话说小王就看准了这一商机,在学校附近开了这么一家果汁店,但是最近他碰到了一个不大不小的难题:小王的果汁店里准备了K台榨汁机,当然每台榨汁机只能榨一种果汁,在某个时段内,一个客人点了某种果汁,如果恰好有某台果汁机榨过这种果汁,那么就直接给客人用这台果汁机接着榨就可以了,但是如果点的是一种新的果汁就需要找一台干净的果汁机来用,问题就出在这,如果这时候还有空的果汁机还好,如果没有的话小王就需要将某台刚才用过的拿去清洗,清洗的话呢就得浪费很多的时间和很多的水,小王是个很有经济头脑的人,他想知道在排队客人需求已知的情况下最少需要清洗多少次果汁机?假定开始时所有果汁机都是干净的,为了方便描述,我们将果汁编号为1(橙汁),2(苹果汁),3(葡萄汁)…

[友情提示:本店不售卖混合果汁]

输入

每组测试数据第一行包括两个整数K,N(1<=K<=10,1<=N<=100), 其中,K表示小王准备了K台干净的榨汁机,N表示排队等待的有N个客人,接下来N行,每行一个整数表示一个客人点的果汁种类Xi(1<=xi<=100).

输出
输出在当前的请求序列下,小王最少需要清洗果汁机的次数

样例输入

2 7
1
2
3
1
3
1
3

样例输出

1

提示
/*
贪心,只要有机器空闲或者说当前需要打的果汁有台机器打了,就继续打下去,暂时不需要清洗。
当前要打的果汁找不到可以用的机器了,此时就必须找一台清洗出来,用来打当前的的果汁。
此时,到底选哪台来清洗呢?
很显然,先看看从当前位置看到队列后面有没有人要这种果汁,如果没有人要了,毫无疑问可以洗这台机器。如果 用着的机器所打的果汁类型 都还有人要呢?那么要找哪种是最相对其他种更后面的那种果汁。即第一个需要现在用着的果汁机所对应的的果汁 排在队列中 相对其他种 更后面的。这种果汁机是要拿出来清洗来解决当前机器不足的问题。
有点绕。。。
直接上代码。
可能很多人对同一种果汁有需求,所以用set存当前果汁机的情况。
*/
ac_code:

#include <bits/stdc++.h>
using namespace std;
set<int>s;
int a[105];
int main()
{
    int k,n;
    cin>>k>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    int ans = 0;
    for(int i = 0; i < n; i++)
    {
        if(s.size() < k) //还有机器空闲
        {
            s.insert(a[i]);
        }
        else
        {
            if(s.count(a[i]))//当前要打的果汁在机器中有,直接打
            {
                s.insert(a[i]);
            }
            else
            {
                //开始找已有的果汁机中哪种在当前队列中需求最后
                int pos = -1, aim,flag;
                for(set<int>::iterator it = s.begin(); it != s.end(); it++)
                {
                    flag = 1; //标记当前队列对这种果汁是否有需求
                   for(int j = i; j < n; j++)
                   {
                       if(a[j]==*it)
                       {
                           flag = 0; //有需求
                           if(j > pos) //需求更后的是哪种
                           {
                               pos = j;
                               aim = a[j];
                           }
                           break;
                       }
                   }
                   if(flag) //没有需求就直接清洗这台
                   {
                       aim = *it;
                       break;
                   }
                }
                //cout<<aim<<endl;
                //更新果汁机的情况
                s.erase(aim); 
                ans++;
                s.insert(a[i]);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo Bliss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值