導航:首頁 > 源碼編譯 > 會場安排問題貪心演算法

會場安排問題貪心演算法

發布時間: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)

閱讀全文

與會場安排問題貪心演算法相關的資料

熱點內容
app的數據越來越大是什麼 瀏覽:198
反編譯步驟意思 瀏覽:642
ug編程怎麼加刀補 瀏覽:623
奶片檢驗指標源碼 瀏覽:590
中國程序員top10 瀏覽:306
iphone上的app怎麼登錄 瀏覽:944
在家很無聊用什麼app 瀏覽:37
安卓介面如何更換 瀏覽:400
雲音樂程序員上線功能 瀏覽:43
小天才手錶如何查看app的使用時長 瀏覽:606
編譯器多久能寫一個 瀏覽:648
過磅怎麼演算法錢 瀏覽:873
同一款手機備份文件夾可以互用嗎 瀏覽:868
matlab圖像處理pdf 瀏覽:66
學python3最好的書 瀏覽:772
maven下載依賴的命令 瀏覽:93
二分查找流程圖演算法 瀏覽:688
質量問題的演算法 瀏覽:84
c代碼編譯吃cpu頻率還是核心 瀏覽:171
pdf簽名adobe 瀏覽:406