Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198214
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-09-23 16:42:18



#include<stdio.h>
#include<algorithm>
using namespace std;

const int Maxn=405;
int g[Maxn];

int main()
{
    int cases;
    scanf("%d",&cases);
    while(cases--)
    {
        int n;
        scanf("%d",&n);
        memset(g,0,sizeof(g));
        for(int i=1;i<=n;i++)
        {
            int s,t;
            scanf("%d%d",&s,&t);
            if(s>t) swap(s,t);
            if(s%2==0) s--;
            if(t%2==1) t++;
            for(int j=s;j<=t;j++) g[j]++;
        }
        int num=0;
        for(int i=1;i<=400;i++) if(g[i]>num) num=g[i];
        printf("%d\n",num*10);
    }
    return 0;
}

总结:

这道题就是算法导论贪心算法那一章后面习题的教室选择问题,它不能用活动选择算法来重复操作几次直至选择了所有的活动来确定教室数等于使用活动选择的次数。因为在某些情境下是错的,具体可以看该题的discuss。那道习题提示采用图着色,亦即不兼容的两个活动间连一条边,最后涂色时相连的两个活动涂不同的颜色,最后总共所需的颜色数就是教室数。图着色采用类似dfs的搜索算法,因此效率很低,但可以用来理解贪心算法的工作原理。

阅读(1043) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~