贪心算法 - 挤奶问题

/*
题目内容:有n头牛(1<=n<=50,000)要挤奶。
给定每头牛挤奶的时间区间[A,B](1<=A<=B<=1,000,000,A,B为整数)。
牛需要呆在畜栏里才能挤奶。一个畜栏同一时间只能容纳一头牛。
问至少需要多少个畜栏,才能完成全部挤奶工作,以及每头牛都放哪个畜栏里?
注意:在同一个畜栏的两头牛,它们挤奶时间区间不能在端点重合。
输入格式:
第1行:一个正整数N;
第2..N+1行:第i+1行的两个整数给出第i头奶牛的挤奶时间。
输出格式:
第1行:需要畜栏的最小数;
第2..N+1行:第i+1行表示第i头奶牛被分配到的畜栏序号
输入样例:
5
1 10
2 4
3 6
5 8
4 7
输出样例:
4
1
2
3
2
4
*/

#include<iostream>

using namespace std;

//奶牛结构体
struct cow
{
    long start;                    //开始挤奶的时间
    long end;                    //结束挤奶的时间
    long bucketNum=-1;            //分配的奶桶编号
};

//奶桶结构体
struct bucket
{
    long sn;                    //编号
    bool inUse=false;            //正在使用的状态
    long latesUseEndTime=-1;    //上次结束使用的时间
};
//题目要求的数字太大了,用数组会栈溢出,而动态分配内存又比较麻烦,所以只好先用小的数目
const int MAXNUM = 50;

//根据给定的奶牛开始挤奶的时间,确定它对应的最早可用的已有的奶桶编号,如果没有则返回负数
long getFirstProperBucket(struct bucket buc[], long total, long startTime) {
    long ret = -1;                                    //若已经使用过的奶桶中没有可用的,则返回负数
    for (long i = 0; i < total; i++) {
        //如果上一次使用的结束时间比现在要求的开始时间早,则可用
        if (buc[i].latesUseEndTime < startTime) {
            ret = i;
            break;
        }
    }
    return ret;
}

//returns the total amount of buckets needed
int solve(struct cow cow[], long n) {

    struct bucket buc[MAXNUM];                        //奶桶数组,最多每头奶牛分配一个奶桶
    long total = 0;                                    //总共所需奶桶数目

    for (long i = 0; i < n; i++) {
        long b = getFirstProperBucket(buc, total, cow[i].start);    //获取一个编号
        if (b >= 0) {                                //如果是正数,代表可用        
        }
        else {                                        //如果是负数,不可用,则添加一个新的奶桶,再分配编号
            total++;
             b=getFirstProperBucket(buc, total, cow[i].start);
        }
        buc[b].latesUseEndTime = cow[i].end;        //将奶桶的上次使用结束时间标记上
        cow[i].bucketNum = b;                        //将奶桶编号记录到奶牛
    }
    return total;
}

int main() {
    struct cow cow[MAXNUM];                    //奶牛数组
    long n;                                    //奶牛数量

    cin >> n;

    //输入数据和初始化
    for (long i = 0; i < n; i++)
    {
        cin >> cow[i].start >> cow[i].end;
        cow[i].bucketNum = -1;
    }

    //所需的奶桶数目
    int num = solve(cow, n);

    cout << num << endl;

    //依次输出奶牛分配的奶桶编号
    for (long i = 0; i < n; i++) {
        cout << cow[i].bucketNum+1<<endl;
    }

    cin >> num;                                //VC中防止程序直接结束
    return 0;
}

 

转载于:https://www.cnblogs.com/memoryLost/p/10703310.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值