贪心算法

贪心算法

* 简单贪心算法初探

  • * T1:有m元钱,那种商品,每种物品的重量为weight,总价值为price,可以使用0到price的任意价格购买相应多的物品,要求输出m元最多能买到多少物品
#include <iostream>
#include <algorithm>
using namespace std;

typedef struct goods 
{
    double weight;  //商品的重量
    double price;   //商品的总价值
    double cost;        //商品的性价比
    bool operator < (const goods &A) const          //">" 不能重载
    {
        return cost > A.cost;
    }
};

int main()
{
    double m;               //钱
    int n;
    while (cin >> m >> n)
    {
        if (m == -1 && n == -1)
            break;
        goods buf[1000];
        for (int i = 0; i < n; i++)
        {

            cin >> buf[i].weight >> buf[i].price;
            buf[i].cost = buf[i].weight / buf[i].price;
        }
        sort(buf, buf+n);
        int idx = 0;
        double result = 0;
        while (idx < n && m > 0)
        {
            if (m > buf[idx].price)
            {
                result = result + buf[idx].weight;
                m -= buf[idx].price;
                idx++;
            }

            else
            {
                result += buf[idx].cost * m;
                idx++;
                m = 0;
            }
        }
        cout << result << endl;
    }
    system("pause");
    return 0;
}
  • T2: “今年暑假不AC?”“是的。”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#¥%……&*%。。。”确实如此,世界杯来了,球迷的节目也来了,估计很多ACMer也会抛开计算机,奔向电视作为球迷,一定想看尽量多的完整比赛,当然,作为新时代的好青年,你一定还会看一些其他的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+1、中国新歌声、以及《开心辞典》等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

    输入:输入数据包含多个测试实例,每个测试实例的第一行只有一个完整整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据i_starttime,i_endtime(1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不作处理。

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct project 
{
    int starttime;          //节目的开始时间
    int endtime;            //节目的结束时间
    bool operator < (const project &A) const 
    {
        return endtime < A.endtime;
    }
};

int main()
{
    int num;
    while (cin >> num)
    {
        if (num == 0)
            break;
        project pro[100];
        for (int i = 0; i < num; i++)
        {
            cin >> pro[i].starttime >> pro[i].endtime;
        }
        sort(pro, pro + num);           //按照结束时间进行相应的排序
        int result = 1;
// int *test = new int[num];
        int idx = 0;
        for (int i = 1; i < num; i++)
            if (pro[i].starttime >= pro[idx].endtime)       //后面节目的开始时间不能比当前节目的结束时间早
            {
                result++;
                idx = i;
            }
        cout << result << endl;
    }
    system("pause");
    return 0;
}

未完待续

点赞