贪心算法

一、贪心算法

       贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 [1]  。

       贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解

二、例题

例题一、区间问题

问题描述:

有n项工作,每项工作分别在si开始,ti结束。对每项工作,你都可以选择参加或不参加,但选择了参加某项工作就必须至始至终参加全程参与,即参与工作的时间段不能有重叠(即使开始的时间和结束的时间重叠都不行)。

限制条件:

1<=n<=100000
1<=si<=ti,=109

样例:

输入

5
1 2 4 6 8
3 5 7 9 10

输出
3(选择工作1, 3, 5)
题解:有三种算法:一是挑选开始时间最早的方案,二是挑选重叠次数最少的方案,三是结束时间最早的方案。经选择,选择方案三

代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<utility>
#define maxn 100005
using namespace std;
typedef pair<int,int> P;
int N,endtime[maxn],starttime[maxn];
P pai[maxn];
int tanxin()
{
    for(int i=0;i<N;i++)
    {
        pai[i].first=endtime[i];
        pai[i].second=starttime[i];
    }
    sort(pai,pai+N);//默认先对first排序,再对second排序
    int t=pai[0].first;
    int ans=1;
    for(int i=0;i<N;i++)
    {
        if(t<pai[i].second)
        {
            t=pai[i].first;
            ans++;
        }
    }
    return ans;
}
int main()
{
    while(cin>>N)
    {
        for(int i=0;i<N;i++)
           cin>>starttime[i];
        for(int i=0;i<N;i++)
            cin>>endtime[i];
        int ans=tanxin();
        cout<<ans<<endl;
    }
    return 0;
}

上一篇:常量和变量(c++简单信息的表达和运算)


下一篇:Select下拉框需求