日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法设计与分析——贪心算法——活动安排问题

發(fā)布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计与分析——贪心算法——活动安排问题 小編覺得挺不錯的,現(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[]) { //先按活動的結(jié)束時間排好序 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[]) { //先按活動的結(jié)束時間排好序 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[]) { //先按活動的結(jié)束時間排好序 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)容還不錯,歡迎將生活随笔推薦給好友。