HDU1050 - Moving Tables (贪心)

本文介绍了一种使用贪心算法解决特定任务调度问题的方法。通过对任务开始和结束时间的处理,确保了即使在复杂情况下也能正确判断任务间的冲突,并通过合理的排序和选取策略达到最小化整体时间消耗的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

思路

贪心,两个操作如果有重叠,就一定不会同时进行,两者以任何顺序操作都不会影响到整体的时间。

所以每次操作时,任取一个并且将可以和他同时进行的操作一次完成,直到全部执行为止。在执行完一个操作后,假如下一个操作并没有和其他操作冲突,那执行必然对整体有利,假如有两个(多个)操作重叠,他们几个肯定不可能同时进行,所以任取一个都可以保证整体最优。

对于这道题还有应该需要注意的一点,这道题并不想其它题那样,直接按照序号大小就可以判断是否相互影响。 因为在走廊两边都有房间,相邻为 1 , 如 4, 5就合理,但 3, 4 就会冲突,所以应该对数据进行处理,比较简单的就是,将数据 + 1 或 - 1 再 / 2,就可以将类似 1, 2 奇偶对处理为等价。

代码

#include <algorithm>
#include <cstdio>

using namespace std;

struct node
{
    int begin;
    int end;
} op[410];


bool cmp(const node & a, const node & b)
{
    return a.begin<b.begin;
}


int main()
{
    int t, n;
    int a, b;
    int ans;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%d%d", &a, &b);
            op[i].begin = (min(a, b)+1)/2;
            op[i].end = (max(a, b)+1)/2;
        }
        sort(op, op+n, cmp);
        ans = 0;
        for(int i=0; i<n; i++)
        {
            if(op[i].begin>0)
            {
                op[i].begin = -1;
                int cur = op[i].end;
                for(int j=i+1; j<n; j++)
                {
                    if(op[j].begin>cur)
                    {
                        op[j].begin = -1;
                        cur = op[j].end;
                    }
                }
                ans++;
            }
        }
        printf("%d\n", ans*10);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值