会场安排问题-记录最后一个测试点错因(暂无答案)

题目来源:王晓东《算法设计与分析》

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的
贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个
顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小
会场数。)

输入格式:

第一行有 1 个正整数k,表示有 k个待安排的活动。
接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间
以 0 点开始的分钟计。

输出格式:

输出最少会场数。

输入样例:

5
1 23
12 28
25 35
27 80
36 50 

输出样例:

在这里给出相应的输出。例如:

3

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


经过调试后仍然无法通过最后一个测试点,只能找老师解决这个问题:

#include <bits/stdc++.h>
using namespace std;

int place[1000];

struct Activity{
    int s;
    int e;
};

bool cmp(Activity a,Activity b)
{
    return a.e<b.e;
}

void Cal_min_place(int place[],int k,Activity act[]){
    //按最早结束的先,排序
    sort(act,act+k,cmp);
    //比place数组的数字大的话就可以放进去当前位置,否则加一
    for(int i=0;i<k;i++){
        for(int j=0;j<k;j++){
            if(act[i].s>=place[j]){
                place[j]=act[i].e;
//                cout<<j<<":"<<place[j]<<endl;
                break;
            }
        }
        
    }
    return;
}
int main(){
    int k;
    cin>>k;
    Activity act[k];
    for(int i=0;i<k;i++){
        cin>>act[i].s>>act[i].e;
    }
//    cout<<act[3].s<<act[3].e<<endl;
    int place[1000];
    for(int i=0;i<1000;i++){
        place[i]=0;
    }
    Cal_min_place(place,k,act);
//    cout<<act[0].s<<" "<<act[0].e<<endl;
    for(int i=0;i<1000;i++){
        if(place[i]==0){
          cout<<i<<endl;
            break;
        }
    }
}

老师的答复,尴尬了:

你的方法是:先按结束时间排序,然后尽可能多的将任务安排给第一个会场,然后,再将剩下的任务尽可能多的分配给第二个会场。。。
但这个算法本身是不正确的。例如:
活动1: 开始时间1 结束时间5
活动2: 3 7
活动3:9 10
活动4:6 13
活动5: 14 18
按照你的思路:应该需要三个会场分别分配1 3 5,2 ,4
而最优解是两个会场:1 4 5,2 3


后续更新正确代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值