当前位置:网站首页>ACM寒假集训#6
ACM寒假集训#6
2022-07-28 10:13:00 【MJ的码农空间】
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
算法思路
贪心算法一般按如下步骤进行:
①建立数学模型来描述问题。
②把求解的问题分成若干个子问题。
③对每个子问题求解,得到子问题的局部最优解。
④把子问题的解局部最优解合成原来解问题的一个解。
贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯。
使用条件
利用贪心法求解的问题应具备如下2个特征。
1、贪心选择性质
一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2、最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析。
题目示例
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%…”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
Sample Input
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
Sample Output
5
代码示例
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)//多组输入
{
int a[110],b[110],i,j,k,t,num=1;
for(i=0;i<n;i++)
scanf("%d %d",&a[i],&b[i]);
for(i=0;i<n-1;i++)//按结束时间排序
{
k=i;
for(j=i+1;j<n;j++)
{
if(b[k]>b[j])//找到最早结束的节目
k=j;
}
t=a[i];//将最早的节目交换到最前面
a[i]=a[k];
a[k]=t;
t=b[i];
b[i]=b[k];
b[k]=t;
}
j=0;
for(i=1;i<n;i++)//节目时间不冲突则num++
{
if(b[j]<=a[i])
{
num++;
j=i;
}
}
printf("%d\n",num);//输出
}
return 0;
}
边栏推荐
- IDEA创建我的第一个项目
- Multithreading and high concurrency (III) -- source code analysis AQS principle
- Skillfully use NGX_ Lua makes traffic grouping
- leetcode076——数组中的第 k 大的数字
- 双指针技巧
- QT | some summaries of signals and slots
- Vulnerability analysis hevd-0x8.integeroverflow[win7x86]
- Step 4 - user development environment settings
- Bitwise and, or, XOR and other operation methods
- Aqua Data Studio 18.5.0导出insert语句
猜你喜欢

C language secondary pointer explanation and example code

Performance test of API gateway APIs IX in Google cloud T2a and T2D

Choosing a supplier service system is the first step for large health industry enterprises to move towards digital transformation

SuperMap iserver publishing management and calling map services

14、双指针——盛最多水的容器

利用正则表达式从文件路径中匹配文件名

【微信小程序】项目实战—抽签应用

SQL Server 2016 学习记录 --- 数据定义

IDEA打包jar包及运行jar包命令

6. Double pointer -- the sum of the two numbers of the incremental array is equal to the target number
随机推荐
QT | some summaries of signals and slots
【栈的应用】--- 中缀表达式转后缀表达式
Get to know SuperMap idesktop for the first time
漏洞分析丨HEVD-0x8.IntegerOverflow[win7x86]
15、判断二维数组中是否存在目标值
海量数据TopN问题
14. Double pointer - the container that holds the most water
2021-10-13arx
多线程与高并发(三)—— 源码解析 AQS 原理
【微信小程序】项目实战—抽签应用
Choosing a supplier service system is the first step for large health industry enterprises to move towards digital transformation
6、双指针——递增数组两数之和与目标数相等
上下文变量值(context values)陷阱及在 Go 中如何避免或缓和这些陷阱
Sort - quick sort (fast and slow pointer Implementation)
KingbaseES V8R6 JDBC 能否使用VIP ?
Go 内存模型 (2014年5月31日版本)
SuperMap iserver publishing management and calling map services
JVM principle
Match file names from file paths using regular expressions
13、哈希表——两个链表第一个公共节点