BZOJ 1028 BZOJ 1029 //贪心

本文介绍了两道JSOI2007的算法题目解析,包括特殊规则的麻将听牌判断及解决方案,以及建筑抢修问题的贪心算法实现。

1028: [JSOI2007]麻将

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2197  Solved: 989
[Submit][Status][Discuss]

Description

  麻将是中国传统的娱乐工具之一。麻将牌的牌可以分为字牌(共有东、南、西、北、中、发、白七种)和序数
牌(分为条子、饼子、万子三种花色,每种花色各有一到九的九种牌),每种牌各四张。在麻将中,通常情况下一
组和了的牌(即完成的牌)由十四张牌组成。十四张牌中的两张组成对子(即完全相同的两张牌),剩余的十二张
组成三张一组的四组,每一组须为顺子(即同花色且序数相连的序数牌,例如条子的三、四、五)或者是刻子(即
完全相同的三张牌)。一组听牌的牌是指一组十三张牌,且再加上某一张牌就可以组成和牌。那一张加上的牌可以
称为等待牌。在这里,我们考虑一种特殊的麻将。在这种特殊的麻将里,没有字牌,花色也只有一种。但是,序数
不被限制在一到九的范围内,而是在1到n的范围内。同时,也没有每一种牌四张的限制。一组和了的牌由3m + 2张
牌组成,其中两张组成对子,其余3m张组成三张一组的m组,每组须为顺子或刻子。现给出一组3m + 1张的牌,要
求判断该组牌是否为听牌(即还差一张就可以和牌)。如果是的话,输出所有可能的等待牌。

Input

  包含两行。第一行包含两个由空格隔开整数n, m (9<=n<=400, 4<=m<=1000)。第二行包含3m + 1个由空格隔开
整数,每个数均在范围1到n之内。这些数代表要求判断听牌的牌的序数。

Output

  输出为一行。如果该组牌为听牌,则输出所有的可能的等待牌的序数,数字之间用一个空格隔开。所有的序数
必须按从小到大的顺序输出。如果该组牌不是听牌,则输出"NO"。

Sample Input

9 4
1 1 2 2 3 3 5 5 5 7 8 8 8

Sample Output

6 7 9
 
 
首先观察到n的范围不大,那么就枚举n,之后再枚举对子,然后在先枚举刻子,然后再对顺子进行处理。
 
这里有一个贪心的过程就是刻子先于顺子进行处理,因为刻子先消去对顺子不会有影响,但是反过来就不一定了。
 

1029: [JSOI2007]建筑抢修

Time Limit: 4 Sec  Memory Limit: 162 MB
Submit: 4732  Solved: 2125
[Submit][Status][Discuss]

Description

  小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的
入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全
毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需
要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一
段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多
的建筑。

Input

  第一行是一个整数N接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还
没有修理完成,这个建筑就报废了。

Output

  输出一个整数S,表示最多可以抢修S个建筑.N < 150,000;  T1 < T2 < maxlongint

Sample Input

4
100 200
200 1300
1000 1250
2000 3200

Sample Output

3
 
这题跟之前做的某一道贪心有点类似,那道题只有开始时间和结束时间,然后按照结束时间排序在线性扫描一遍就有答案了。(保证了局部最优解可以通向整体最优解)
 
这道题套一下,按照截至期限排序,如果现在的时间加上其持续的时间小于其截至的时间,那么就将他持续的时间加入优先队列,并且更新现在的时间。
否则的话,考虑能否进行替换,可以知道已经加入优先队列的任务是连续排列的(指的是时间无缝连接),倘若本次的时间小于其中最大的持续时间,那么显然本次对于整体结果来说是一个更优的选择,就进行一下替换。(最长连续上升子序列的贪心?)
 
按截止期限排序到底保证了上述操作进行的无误。
 
 
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
priority_queue<int>Q;
struct node
{
    int last,deadline;
} cstr[150008];
bool cmp(const node &a,const node &b)
{
    if(a.deadline==b.deadline) return a.last<b.last;
    return a.deadline<b.deadline;
}
int main()
{
    int now=0,n,cnt=0;
    scanf("%d",&n);
    for(int i=1; i<=n; ++i) scanf("%d%d",&cstr[i].last,&cstr[i].deadline);
    sort(cstr+1,cstr+n+1,cmp);
    for(int i=1; i<=n; ++i)
    {
        if(now+cstr[i].last<=cstr[i].deadline)
        {
            Q.push(cstr[i].last);
            ++cnt;
            now+=cstr[i].last;
        }
        else if(cstr[i].last<=Q.top())
        {
            now+=cstr[i].last-Q.top();
            Q.pop();
            Q.push(cstr[i].last);
        }
    }
    printf("%d\n",cnt);
}
 

转载于:https://www.cnblogs.com/mfys/p/7018477.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值