贪心算法——活动安排问题

来源:互联网 发布:南海海沟大地震 知乎 编辑:程序博客网 时间:2024/05/21 09:56

贪心策略:

   最早结束的活动,优先安排。

   把n个活动按照结束时间非减序排列。

一.输入的活动按照结束时间的非减序

#include <iostream>using namespace std;int a[100][100];int main(){int n,i,j;   cout<<"请输入活动的数目:" ; cin>>n;   //n个活动 cout<<"请依次输入每个活动的起始时间和结束时间:"<<endl ; for(i=0;i<n;i++) cin>>a[i][0]>>a[i][1];i=0;     int all=1;  //总共可以安排的活动数for(j=1;j<n;j++){if(a[i][1]<a[j][0]){all++;i=j;}} cout<<all<<endl;return 0;} 


二.输入的活动并未按照结束时间排序

#include <iostream>using namespace std;int a[100][100];int main(){int n,i,j,q,temp;   cout<<"请输入活动的数目:" ; cin>>n;   //n个活动 cout<<"请依次输入每个活动的起始时间和结束时间:"<<endl ; for(i=0;i<n;i++) cin>>a[i][0]>>a[i][1];for(i=0;i<n;i++){q=i;for(j=i+1;j<n;j++) {if(a[q][1]>a[j][1])   q=j;}temp=a[i][1];a[i][1]=a[q][1];a[q][1]=temp;temp=a[i][0];    a[i][0]=a[q][0];a[q][0]=temp;}i=0;     int all=1;  //总共可以安排的活动数for(j=1;j<n;j++){if(a[i][1]<a[j][0]){all++;i=j;}} cout<<all<<endl;return 0;} 


计蒜客-法师康的工人

三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机。第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产,一直到1000时刻。第二个工人,在700时刻开始,在1100时刻结束。第三个工人从1500时刻工作到2100时刻。期间最长至少有一个工人在生产线上工作的连续时间为900秒(从200时刻到1100时刻),而最长的无人生产的连续时间(从生产开始到生产结束)为400时刻(1100时刻到1500时刻)。

你的任务是用一个程序衡量N个工人在N条产品线上的工作时间列表(1≤N≤5000,以秒为单位)。

最长的至少有一个工人在工作的时间段

最长的无人工作的时间段(从有人工作开始计)

输入第1行为一个整数N,第2-N+1行每行包括两个均小于1000000的非负整数数据,表示其中一个工人的生产开始时间与结束时间。输出为一行,用空格分隔开两个我们所求的数。

样例输入

3200 1000700 11001500 2100

样例输出

900 400

思路:这道题写的比较早了吧,当时按照开始的时间进行排序的。贪心算法是按照结束时间排序,可自行尝试。

代码:

#include <iostream>using namespace std;int a[6000][2];int main(){int n;cin>>n;for(int i=0;i<n;i++)  cin>>a[i][0]>>a[i][1];int maxt=0,mint=0;for(int i=0;i<n-1;i++)  //按照开始工作的时间进行排序{  for(int j=0;j<n-1-i;j++)  {  if(a[j][0]>a[j+1][0])  {  int temp1=a[j][0];  int temp2=a[j][1];  a[j][0]=a[j+1][0];  a[j][1]=a[j+1][1];  a[j+1][0]=temp1;  a[j+1][1]=temp2;}  }  }int l=a[0][0],r=a[0][1];maxt=r-l;    for(int i=1;i<n;i++){if(a[i][0]<=r&&a[i][1]>=r)   //两个工人工作的时间有交集,则更新右边界   r=a[i][1];if(a[i][0]>r)   //下一个工人开始工作的时间与右边界没有交集{if(maxt<r-l)  maxt=r-l;    if(mint<a[i][0]-r)  mint=a[i][0]-r;l=a[i][0];    r=a[i][1];   }   }cout<<maxt<<" "<<mint<<endl;return 0;} 




原创粉丝点击