码迷,mamicode.com
首页 > 编程语言 > 详细

贪心算法 - 挤奶问题

时间:2019-04-13 23:45:22      阅读:412      评论:0      收藏:0      [点我收藏+]

标签:struct   完成   整数   []   工作   int   最小   tar   添加   

/*
题目内容:有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;
}

 

贪心算法 - 挤奶问题

标签:struct   完成   整数   []   工作   int   最小   tar   添加   

原文地址:https://www.cnblogs.com/memoryLost/p/10703310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!