ACM乐园
Love Me,Love My Code!
posts - 53,  comments - 24,  trackbacks - 0
会场安排问题

 

问题描述:

 

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

 

编程任务:

 

  对于给定的k 个待安排的活动,编程计算使用最少会场的时间表。

 

数据输入:

 

  由文件input.txt 给出输入数据。第一行有1 个正整数k,表示有k 个待安排的活动。接下来的k 行中,每行有2 个正整数,分别表示k 个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。

 

结果输出:

 

  将编程计算出的最少会场数输出到文件output.txt 。

 

输入文件示例输出文件示例

input.txt   output.txt

5                   3

1 23

12 28

25 35

27 80

36 50

方法:
1、首先定义数据结构:以时间为核心,定义结构体point,它拥有两个属性,t是时间,f表示是开始时间还是结束时间
2、对所有对象按时间大小排序
3、依次计算,如果是开始时间则count++,如果是结束时间则count--,其中最大的count即是最少的会场数。count表示目前开始且未结束的活动数

//会场安排问题(贪心算法)
//input.txt
//5
//1 23
//12 28
//25 35
//27 80
//36 50
//output.txt
//3
#include <iostream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

struct point
{
    
int t;
    
bool f;
};

bool cmp(point x,point y)
{
    
return x.t<y.t;
}

int greedy(vector<point> x)
{
    
int max=0,cur=0,n=x.size();
    sort(x.begin(),x.end(),cmp);
    
for(int i=0;i<n;i++)
    {
        
if(x[i].f) 
            cur
++;
        
else
            cur
--;
        
if((i==n-1 || x[i].t<x[i+1].t) && cur>max)//处理x[i]==x[i+1]的情况
            max=cur;                              //当cur>max且x[i]==x[i+1]时,i时间肯定是开始时间,i+1时间可能是开始时间,也可能是结束时间
    }                                              //如果是结束时间,说明某活动开始时间和结束时间相同,不需要会场,故不对max更新;如果是开始时间,那在i+1次更新max效果一样
    return max;                                   //因此i次不进行更新
}

int main()
{
    vector
<point> x;
    
int n,i;
    point temp;
    
while(cin>>n,n)
    {
        
for(i=0;i<n;i++)
        {
            temp.f
=true;
            cin
>>temp.t;
            x.push_back(temp);
            temp.f
=false;
            cin
>>temp.t;
            x.push_back(temp);
        }
        cout
<<greedy(x)<<endl;
        x.clear();
    }
    
return 0;
}



 

posted on 2012-10-19 09:38 大大木马 阅读(15751) 评论(5)  编辑 收藏 引用

FeedBack:
# re: 会场安排问题(贪心算法)
2013-05-06 16:26 | gg
#include<stdio.h>
#define N 101
void main()
{
int a[N]={0}, s,e,k,max;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d",&s,&e);
for(;s<=e;s++)
a[s]++;
}
max=a[1];
for(int i=2;i<=N;i++)
if(max<a[i])max=a[i];
printf("%d",max);
}  回复  更多评论
  
# re: 会场安排问题(贪心算法)
2014-05-13 09:10 |
#include<iostream>
using namespace std;
int Partition(int a[], int low, int high)
{
int i,j;
int x = a[low];
i = low;
j = high;
while(i<j)
{
while(i<j&&x < a[j]) {
j = j - 1;

}
if(i<j)
{
a[i] = a[j];
i=i+1;
}
while(i<j&&x >= a[i])
{
i = i + 1;
}
if(i<j)
{
a[j] = a[i];
j=j-1;
}
}
a[i] = x;
return i;
}
void QuickSort(int a[], int low, int high)
{
int Position;
if(low < high)
{
Position = Partition(a,low,high);
QuickSort(a, low, Position-1);
QuickSort(a, Position+1, high);
}
}
int schedule(int a[],int b[],int s,int e)
{
int n=0;
int i=s+1;
if (a[s]>-1)
{
n=1;
for(;i<=e;i++)
if(a[i]>=b[s])
s++;
else
n++;
}
return n;
}
int main( )
{
int n;
cin>>n;
int *st= new int[n];
int *et=new int[n];
for(int i=0;i<n;i++)
cin>>st[i]>>et[i];
QuickSort(st,0,n-1);
QuickSort(et,0,n-1);
cout<< schedule(st,et,0,n-1) <<endl;
delete []st;
delete []et;
return 0;
}  回复  更多评论
  
# re: 会场安排问题(贪心算法)
2014-11-09 15:13 | 张三
#include<iostream>
#include<fstream>
using namespace std;

int Greedyplan(int start[],int end[],int n)
{
int maxCount=0;
for(int j=0;j<n-1;j++)
{
int count=1;
for(int i=j+1;i<n;i++)
{
if(start[i]<end[j])
{
count++;
if(count>maxCount)
{
maxCount=count;
}
}else
break;
}
}
return maxCount;
}

int main()
{
fstream fin;
fin.open("input.txt",ios::in);
if(fin.fail())
{
cout<<"File does not exist!"<<endl;
cout<<"Exit program"<<endl;
return 0;
}

int n;
fin>>n;

int *a=new int[n];
int *b=new int[n];
for(int i=0;i<n;i++)
{
fin>>a[i];
fin>>b[i];
}

int mm=Greedyplan(a,b,n);

fstream fout;
fout.open("output.txt",ios::out);
fout<<mm;

fin.close();
fout.close();
system("pause");
return 0;
}  回复  更多评论
  
# re: 会场安排问题(贪心算法)
2015-07-06 10:07 | lizi
貌似有问题吧,测试数据
5
1 2
3 4
5 6
7 8
9 10
输出1  回复  更多评论
  
# re: 会场安排问题(贪心算法)
2015-12-10 21:29 | patrick
@lizi
这个没有问题啊,只需要一个会场就安排了所有的活动  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔档案(53)

文章档案(2)

搜索

  •  

积分与排名

  • 积分 - 63964
  • 排名 - 351

最新评论

阅读排行榜

评论排行榜