洛谷 2093 零件分组 贪心

题目:
https://www.luogu.org/problem/show?pid=2093
拦截导弹?

每个物品有两个状态;

所以需要综合考虑;

开始的想法:将他们的和从小到大排序;
这样是不对的;
我们可以将其中一个价值排序,这样,我们就有了贪心的方向;
将另一个状态做拦截导弹就可以了;(显然?)
因为我们可以保证a数组是单调递减的;
能更新大的就更新大的,将小的留给后面更”需要”的物品; 学会善良地贪

方法二:
求最长下降子序列,它的长度即为答案;
证明:
假设已经有下降子序列: a、b;
存在一个c在在a,b后面;
if c > a , c可以在a组;
if c < a, c > b ,c可以在b组;
else c < b,c只能单独一组;
证毕……
当然,这里的a,b并不是固定不变的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=10001;
int n,tot;
struct hh
{
    int x,y;
}ma[MAXN];
int a[MAXN];
bool cmp(hh a,hh b)
{
    if(a.x==b.x) return a.y<b.y;//从小到大;
    else return a.x<b.x;
}

void solve()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&ma[i].x,&ma[i].y);
    sort(ma+1,ma+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        bool flag=0;
        for(int j=1;j<=tot;j++)
        {
            if(a[j]<=ma[i].y)
            {
                a[j]=ma[i].y,flag=1;
                break;
            }
        }
        if(!flag) a[++tot]=ma[i].y;
    }
    cout<<tot<<endl;
    return;
}

int main()
{
    solve();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种常用的优化算法,用于求解最优化问题。在解决交通灯信号分组的问题时,贪心算法可以被用于找到一种最优的方案。 首先,我们需要明确问题的具体要求和约束条件。交通灯信号分组的目标是使得整个交通流畅高效,最小化交通等待时间。 然后,我们可以按照以下步骤使用贪心算法解决交通灯信号分组问题: 1. 收集交通流量数据:我们需要收集并分析交通流量数据,包括不同道路的车流量和车辆通过时间。 2. 初步分组:根据交通流量数据,我们可以初步将交通灯信号划分为若干个分组,每个分组包含相邻道路上的交通灯信号。 3. 计算等待时间:通过模拟车辆通过的过程,我们可以计算出每个分组中车辆的等待时间。 4. 贪心策略:根据计算出的等待时间,我们可以采用贪心策略,从待分组的交通灯信号中选取一个具有最小等待时间的信号,作为下一个分组的起点。 5. 更新分组:选取最小等待时间的信号后,我们将其和相邻信号一起放入下一个分组中。然后,我们更新剩余交通灯信号的等待时间,并重复步骤4,直到所有信号都被分组为止。 6. 优化结果:最后,我们可以对计算出的分组方案进行优化调整,以进一步减少交通等待时间。 总之,贪心算法可以很好地应用于交通灯信号分组问题,通过选择具有最小等待时间的信号进行分组,可以使整个交通流畅高效。但是需要注意的是,贪心算法并不保证能够找到全局最优解,所以在实际应用中,还需要进行后续的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值