会场安排问题:做完之后发现答案很简单,很气,但还是把自己写的贴上来。
#include<iostream> #include<algorithm> using namespace std; void Put(int n,int start[],int end[],int mark[],int space[]){ for(int i=0;i<n;i++) { space[i] = 0; mark[i] = 0; } int count=0; for( int i=0;i<n;i++){ cout<<"count= "<<count<<endl; cout<<"会场当前结束时间: "; for(int k=0;k<=count;k++) cout<<space[k]<<" "; sort(space,space+count+1); cout<<"\n会场当前结束时间排序后: "; for(int k=0;k<=count;k++) cout<<space[k]<<" "; cout<<endl; for(int j=0;j<=count;j++){ if(start[i] > space[j]){ mark[i] = 1; space[j] = end[i]; cout<<"end["<<i<<"] = "<<end[i]<<" space[ "<<j<<"]= "<<space[j]<<endl; break; } } if(mark[i] !=1) { count++; space[count] = end[i]; cout<<"end["<<i<<"] = "<<end[i]<<" space[ "<<count<<"]= "<<" "<<space[count]<<endl; } } cout<<"使用会场的个数:"<<count+1<<endl; cout<<"会场最后结束时间:"; for(int i=0;i<=count;i++) cout<<space[i]<<" "; } int main(){ int n=5; int start[5] = {1,12,25,27,36}; int end[5] = {23,28,35,80,50}; int mark[n]; int space[n]; Put(n,start,end,mark,space); return 0; }
算法的时间复杂度: 设有 n 个活动,使用了k(k<=n)个会场,则时间复杂度为 O(n(k+nlogn))
贴一下习题解答的代码:
int greedy(vector<point>x){ int sum = 0,curr = 0,n = x.size(); sort(x.begin(),x.end()); for(int i=0;i<n;i++){ if(x[i].leftend()) curr++; else curr--; if((i == n-1 ||x[i]<x[i+1])&&curr>sum) sum = curr; } return sum; }