生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——贪心算法——活动安排问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題描述:設(shè)有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內(nèi)只有一個活動能使用這一資源。
每個活動i都有一個要求使用該資源的起始時間si和一個結(jié)束時間fi,且si<fi 。
如果選擇了活動i,則它在半開時間區(qū)間[si, fi)內(nèi)占用資源。
貪心算法總是做出在當(dāng)前看來是最好的選擇,也就是說,貪心算法并不從整體最優(yōu)上加以考慮,所做出的的選擇只是某種意義上的局部最優(yōu)選擇;
雖然貪心算法不是對所有的問題都能得到整體最優(yōu)解,但對范圍相當(dāng)廣的許多問題都能產(chǎn)生最優(yōu)解,即使貪心算法不能得到整體最優(yōu)解,但其最終結(jié)果卻是最終結(jié)果卻是最優(yōu)解的很好的近似解。
將活動按照結(jié)束時間進(jìn)行從小到大排序。然后用i代表第i個活動,s[i]代表第i個活動開始時間,f[i]代表第i個活動的結(jié)束時間。按照從小到大排序,挑選出結(jié)束時間盡量早的活動,并且滿足后一個活動的起始時間晚于前一個活動的結(jié)束時間,全部找出這些活動就是最大的相容活動子集合。
#include<iostream>
using namespace std
;void activity_arrangement(int n
,int start
[],int final
[],bool result
[])
{ int temp
;result
[1]=true;temp
=1;for(int i
=2;i
<=n
;i
++){if(final
[temp
]<=start
[i
]){result
[i
]=true;temp
=i
;}else{result
[i
]=false;}}}int main()
{int n
;cout
<<"輸入活動的個數(shù):";cin
>>n
; int start
[n
+1];int final
[n
+1];cout
<<"輸入活動的開始時間序列:";for(int i
=1;i
<=n
;i
++){cin
>>start
[i
];}cout
<<"輸入活動的結(jié)束時間序列:";for(int i
=1;i
<=n
;i
++){cin
>>final
[i
];}bool result
[n
+1];activity_arrangement(n
,start
,final
,result
);for(int i
=1;i
<=n
;i
++){cout
<<result
[i
]<<" ";}return 0;}
改進(jìn):能夠自動進(jìn)行排好結(jié)束時間
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std
;typedef struct Node
{int start
;int final
;
}node
;bool cmp(node x
,node y
)
{if(x
.final
<y
.final
)return true;elsereturn false;
}
void activity_arrangement(int n
,int start
[],int final
[],bool result
[])
{ Node node
[n
+1];for(int i
=1;i
<=n
;i
++){node
[i
].start
=start
[i
];node
[i
].final
=final
[i
];}sort(node
+1,node
+n
+1,cmp
);for(int i
=1;i
<=n
;i
++){start
[i
]=node
[i
].start
;final
[i
]=node
[i
].final
;}int temp
;result
[1]=true;temp
=1;for(int i
=2;i
<=n
;i
++){if(final
[temp
]<=start
[i
]){result
[i
]=true;temp
=i
;}else{result
[i
]=false;}}}int main()
{int n
;cout
<<"輸入活動的個數(shù):";cin
>>n
; int start
[n
+1];int final
[n
+1];cout
<<"輸入活動的開始時間序列:";for(int i
=1;i
<=n
;i
++){cin
>>start
[i
];}cout
<<"輸入活動的結(jié)束時間序列:";for(int i
=1;i
<=n
;i
++){cin
>>final
[i
];}bool result
[n
+1];activity_arrangement(n
,start
,final
,result
);for(int i
=1;i
<=n
;i
++){cout
<<result
[i
]<<" ";}return 0;}
自動排序的
#include<iostream>
#include<algorithm>
using namespace std
;typedef struct Node
{int starttime
;int finaltime
;}node
;bool cmp(node a
, node b
){return (a
.finaltime
<b
.finaltime
);}void activity_arrangement(int n
,Node node
[],bool result
[])
{ sort(node
+1,node
+n
+1,cmp
);int temp
;result
[1]=true;temp
=1;for(int i
=2;i
<=n
;i
++){if(node
[temp
].finaltime
<=node
[i
].starttime
){result
[i
]=true;temp
=i
;}else{result
[i
]=false;}}}int main()
{int n
;cout
<<"輸入活動的個數(shù):";cin
>>n
; Node node
[n
+1];cout
<<"輸入活動的開始和結(jié)束的時間序列:"<<endl
;for(int i
=1;i
<=n
;i
++){cin
>>node
[i
].starttime
>>node
[i
].finaltime
;}cout
<<"活動的開始和結(jié)束的時間序列:"<<endl
;for(int i
=1;i
<=n
;i
++){cout
<<"["<<i
<<"]:"<<"("<<node
[i
].starttime
<<","<<node
[i
].finaltime
<<")"<<endl
;}bool result
[n
+1];activity_arrangement(n
,node
,result
);cout
<<"安排的活動為:"<<endl
; int num
=0;for(int i
=1;i
<=n
;i
++){if(result
[i
]==1){ num
++;cout
<<"["<<i
<<"]:"<<"("<<node
[i
].starttime
<<","<<node
[i
].finaltime
<<")"<<endl
; } }cout
<<"可以安排的活動個數(shù)為:"<<num
<<endl
;return 0;}
總結(jié)
以上是生活随笔為你收集整理的算法设计与分析——贪心算法——活动安排问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。