贪心法求解蓄栏保留问题

问题描述

农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。
现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案,输出一种即可。

问题求解

牛的编号为1~n,每头牛的挤奶时间相当于一个活动,与前面活动安排问题不同,这里的活动时间是闭区间,例如[2,4]与[4,7]是交叉的,它们不是兼容活动。
采用与求解活动安排问题类似的贪心思路,将所有活动这样排序:结束时间相同按开始时间递增排序,否则按结束时间递增排序。
求出一个最大兼容活动子集,将它们安排在一个蓄栏中(蓄栏编号为1);如果没有安排完,再在剩余的活动再求下一个最大兼容活动子集,将它们安排在另一个蓄栏中(蓄栏编号为2),以此类推。
也就是说,最大兼容活动子集的个数就是最少蓄栏个数。

代码

struct Cow
{
    int no;
    int b;
    int e;
    bool operator<(const Cow &s)const
    {
        if(e==s.e)
            return b<=s.b;
        else
            return e<=s.e;
    }
};

int n=5;
Cow A[]={{0},{1,1,10},{2,2,4},{3,3,6},{4,5,8},{5,4,7}};

int ans[MAXN];

void solve()
{
    sort(A+1,A+n+1);
    memset(ans,0,sizeof(ans));
    int num=1;

    for(int i=1;i<=n;i++)
    {
        if(ans[i]==0)
        {
            ans[i]=num;
            int preend=A[i].e;
            for(int j=i+1;j<=n;j++)
            {
                if(A[j].b>preend&&ans[j]==0)
                {
                    ans[j]=num;
                    preend=A[j].e;
                }

            }
            num++;
        }
    }
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓄栏保留问题是指当输入流中的字符比需要读入的字符数少时,多余的字符留在输入流中,影响后续的输入操作。为了解决这个问题,我们可以使用以下两种方法: 1. 使用 `cin.ignore()` 函数清空输入流。 该函数的作用是清空输入流中的一个或多个字符,它的原型为: ```cpp istream& ignore(streamsize n = 1, int delim = EOF); ``` 其中,`n` 表示要忽略的字符数,`delim` 表示遇到该字符时停止忽略,默认为 `EOF`,即流的结束标志。 例如,假设要读入一个整数和一个字符,但输入中有多余的字符: ```cpp int num; char ch; cin >> num >> ch; ``` 如果输入为 "123a",则读入 `num` 后,输入流中剩余字符 "a",影响后续的输入操作。此时可以加上一行 `cin.ignore()` 函数来清空输入流: ```cpp int num; char ch; cin >> num; cin.ignore(); cin >> ch; ``` 2. 使用 `getline()` 函数读入一行,再从中提取所需数据。 该函数的作用是读入一行字符,它的原型为: ```cpp istream& getline(istream& is, string& str, char delim = '\n'); ``` 其中,`is` 表示输入流对象,`str` 表示存储读入的字符串的对象,`delim` 表示行结束符,默认为换行符 `\n`。 例如,假设要读入一个整数和一个字符,但输入中有多余的字符: ```cpp int num; char ch; string line; getline(cin, line); stringstream ss(line); ss >> num >> ch; ``` 这先用 `getline()` 函数读入一行字符,再用 `stringstream` 对象将其转换成输入流,从中提取所需数据。这种方法可以避免使用 `cin.ignore()` 函数,但需要引入 `sstream` 头文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值