基础篇2——贪心法

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

经典例题:

一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。输入卖糖果的价钱,输出最少的找零个数。

分析:是找回个数越少越好即找回的面值尽可能大
#include <iostream>
#include<algorithm>
using namespace std;

struct pa                        //建立结构体,s,e分别为起止时间
{
    int s,e;
}a[1000];
int cmp(const pa&a,const pa&b)    //定义排序法   设pa中有a,b两组,按开始时间升序排序
{
    return a.s<b.s;
    if(a.s==b.s) return a.e<b.e;
}
int main()
{
    int n,sum,i,j,max;
    while(cin>>n)
    {
        for(i=0;i<n;i++)         //输入起止时间
        {
            cin>>a[i].s>>a[i].e;
        }
        sort(a,a+n,cmp);        //按定义的方法排序
        max=0;
        for(i=0;i<n-1;i++)      //注意!不一定从第一个开始就能看得最多     例:1  25    从第一个数只能看一个
        {                                                                      2  4     第二个开始能看两个
            sum=1;                                                             3  6     故起点不一定是排序后第一个
            for(j=i+1;j<n;j++)                                                 5  7
            {                                                                                  
                if(a[j].s>=a[j-1].e) sum++;   //后一个开始时间在前一个之后,可看,sum++;
            }
            if(sum>max) max=sum;
        }
        cout<<max<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值