导航:首页 > 源码编译 > 会场安排问题贪心算法

会场安排问题贪心算法

发布时间:2022-03-12 03:48:45

① 下题贪心算法一种形式望解得合理安排会议最多编写程序,输入10个会议开始和结束时间,输出选中的会议。。

王才”使用甄后与曹植的爱情故事。见《文选·洛神赋》李善注说:魏东阿王曹植曾求娶甄氏为妃,曹操却将她许给曹丕。甄后被谗死后,曹丕将她的遗物玉带金镂枕送给曹植。曹植离京归国途经洛水,梦见甄后对他说:“我本托心君王,其心不遂。此枕是我在家时从嫁,前与五官中郎将(曹丕),今与君王。”曹植感其事作《感甄赋》,

② C语言程序问题——活动安排问题

题目出得不严密,题目要求是“计算安排的活动最多时会场使用时间”,但当“安排的活动最多”有多种安排方式,题目中却没说输出这多种方式中的哪一种的会场使用时间。例如 :当有3项活动要安排,开始时间和结束时间分别是1 2、3 5、4 5,这时可以安排第一项和第二项活动,也可以安排第一项和第三项活动,前者的会场使用时间是5,后者是4,这时是输出4还是5,题目中没用指出。先假设测试数据不会出现上述情况,则利用贪心算法求解活动安排问题是一种最常用的方法:#include<stdio.h>
#include<stdlib.h>
struct activity
{
int start;
int end;
}act[8501];
int comp(const void *p, const void *q)
{
struct activity *a=(struct activity *)p;
struct activity *b=(struct activity *)q;
return a->end-b->end;
}
int main()
{
int i,k,res,e;
while(scanf("%d",&k)!=EOF)
{
for(i=0;i<k;i++) scanf("%d%d",&act[i].start,&act[i].end);
qsort(act,k,sizeof(act[0]),comp);
res=act[0].end-act[0].start+1;
e=act[0].end;
for(i=1;i<k;i++)
{
if(act[i].start>e)
{
res+=act[i].end-act[i].start+1;
e=act[i].end;
}
}
printf("%d\n",res);
}
return 0;
}

③ 会场安排问题

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

解活动安排问题的贪心算法greedySelector :
public static int greedySelector(int [] s, int [] f, boolean a[])
{
int n=s.length-1;
a[1]=true;
int j=1;
int count=1;
for (int i=2;i<=n;i++) {
if (s[i]>=f[j]) {
a[i]=true;
j=i;
count++;
}
else a[i]=false;
}
return count;
}
由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

活动安排问题源代码:
#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(cur>max)
max=cur;
}
return max;
}

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;
}

④ 贪心算法的会场安排问题

查找有冲突的活动,将有冲突的放到第二个会场。
继续查找有冲突的活动,放到第三个会场。
就是贪心么。先按第一会场排,然后排第二会场、……
不知道是不是最优解。暂时还想不到反例。

⑤ 贪心算法 活动安排问题

这道题的贪心算法比较容易理解,我就不多说明了,只是提到一下算法思路1、建立数学模型描述问题。我在这里将时间理解成一条直线,上面有若干个点,可能是某些活动的起始时间点,或终止时间点。在具体一下,如果编程来实现的话,将时间抽象成链表数组,数组下标代表其实时间,该下标对应的链表代表在这个时间起始的活动都有哪些,具体参照程序注释。2、问题分解。为了安排更多的活动,那么每次选取占用时间最少的活动就好。那么从一开始就选取结束时间最早的,然后寻找在这个时间点上起始的活动,以此类推就可以找出贪心解。程序代码:#include<stdio.h>
struct inode //自定义的结构体
{
int end; //表示结束时间
inode *next; //指向下一个节点的指针
};int main()
{
inode start[10001],*pt;
int a,b,i,num=0; //num负责计数,i控制循环,a,b输入时候使用
for(i=0;i<10001;i++) //初始化
{
start[i].next=NULL;
}
while(scanf("%d %d",&a,&b)) //输入并建立数据结构
{
if(a==0&&b==0) break;
pt=new inode; //创建新的节点,然后将该节点插入相应的位置
pt->end=b;
pt->next=start[a].next;
start[a].next=pt;
}
i=0;
while(i<10001) //进行贪心算法,i表示当前时间
{
if(start[i].next==NULL)
{
i++; //该时间无活动开始
}
else
{
int temp=10001; //临时变量,存储该链表中最早的终止时间
for(pt=start[i].next;pt!=NULL;pt=pt->next)
{
if(pt->end<temp)
{
temp=pt->end;
}
}
i=temp; //将当前时间设置成前一子问题的终止时间
num++;
}
}
printf("%d\n",num); //打印结果
return 0;
}代码并不一定是最快速的,但是可以求出贪心解,如果你做的是ACM编程题目,不保证能AC注释我尽力写了,希望对你有帮助。

⑥ OJ贪心算法,活动安排,求大神解答

按结束时间从小到大排序,之后从开始贪心即可

⑦ 贪心算法之会场安排问题

三星算法之间最好还是不要安排互相的问题,这样不利于你们俩的关系的便有好。

⑧ 请高手进来解答一下这道算法设计与分析的题目,谢谢了!!

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

在下面所给出的解活动安排问题的贪心算法greedySelector:

publicstaticintgreedySelector(int[]s,int[]f,booleana[])

{

intn=s.length-1;

a[1]=true;

intj=1;

intcount=1;

for(inti=2;i<=n;i++){

if(s[i]>=f[j]){

a[i]=true;

j=i;

count++;

}

elsea[i]=false;

}

returncount;

}

由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:

i 1 2 3 4 5 6 7 8 9 10 11

S[i] 1 3 0 5 3 5 6 8 8 2 12

f[i] 4 5 6 7 8 9 10 11 12 13 14

⑨ 会场安排问题,java的实现

您好,提问者:
会议数组那么肯定存放一个对象,我举个简单的Person例子:

importjava.util.Comparator;
importjava.util.Iterator;
importjava.util.TreeSet;


publicclassTest{
publicstaticvoidmain(String[]args){
//使用匿名内部类进行排序
TreeSet<Person>set=newTreeSet<Person>(newComparator<Person>(){
publicintcompare(Persono1,Persono2){
intnum=newInteger(o2.end).compareTo(o1.end);
returnnum;
}
});
set.add(newPerson(1,3));
set.add(newPerson(2,5));
System.out.println("开始时间 结束时间");
for(Iterator<Person>it=set.iterator();it.hasNext();){
Personp=it.next();
System.out.println(p.start+" "+p.end);
}
}
}
classPerson{
intstart;
intend;
publicPerson(intstart,intend){
this.start=start;
this.end=end;
}
}

//输出结果:

开始时间 结束时间

2 5

1 3

⑩ 采用贪心算法进行安排。对算法的时间和空间复杂度进行分析

时间主要是 排序用时了,快速排序 一般是 o(n*logn)
空间 复杂度基本上是 0(1)

阅读全文

与会场安排问题贪心算法相关的资料

热点内容
二分查找流程图算法 浏览:683
质量问题的算法 浏览:79
c代码编译吃cpu频率还是核心 浏览:165
pdf签名adobe 浏览:405
在家无聊解压图片 浏览:534
单片机拨打电话 浏览:440
单片机问题解说 浏览:795
我的世界手机版命令方块零重力 浏览:689
解压游戏无广告最新版 浏览:423
如何下载养生堂app 浏览:242
oracle中文乱码java 浏览:937
儿童编程实践课小结 浏览:482
APP是如何实现数据获取的 浏览:522
买车子看什么app 浏览:832
美国单片机 浏览:815
如何在app上架自己的游戏 浏览:463
安卓系统车载导航支持什么格式u盘 浏览:627
天翼云服务器怎么打开端口 浏览:913
如何启用对服务器远程的访问 浏览:779
程序员环境分析 浏览:820