划分字母区间 c语言,贪心算法 - osc_kl6fknqf的个人空间 - OSCHINA - 中文开源技术交流社区...

一、贪心算法

贪心算法(又称贪婪算法)是指,在对

问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解

[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

#include

#include

#include

#define maxn 100005

using namespace std;

typedef pair P;

int N,endtime[maxn],starttime[maxn];

P pai[maxn];

int tanxin()

{

for(int i=0;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

{

if(t

{

t=pai[i].first;

ans++;

}

}

return ans;

}

int main()

{

while(cin>>N)

{

for(int i=0;i

cin>>starttime[i];

for(int i=0;i

cin>>endtime[i];

int ans=tanxin();

cout<

}

return 0;

}

例题二、分饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值

样例

输入:3  2

1 2 3

1 1

输出: 1

题解:本题采用贪心策略。将饼干和孩子需要的从小到大排序,然后选择按顺序选择饼干。

代码

#include

#include

#include

#define maxn 100005

using namespace std;

int main()

{

int N,M,cookie[maxn],stu[maxn];

while(cin>>N>>M&&M)

{

int ans=0;

for(int i=0;i

cin>>cookie[i];

for(int i=0;i

cin>>stu[i];

sort(cookie,cookie+N);

sort(stu,stu+M);

for(int c=0,s=0;s

{

if(stu[s]>=cookie[c])

{

ans++;

s++;

}

if(stu[s]

continue;

}

cout<

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值