ITA 贪心算法

来源:互联网 发布:彩票组合软件 编辑:程序博客网 时间:2024/06/06 07:04

书上的例子,活动选择问题

<span style="font-size:10px;">typedef struct Act{int s;int f;}Act;bool cmp(Act a, Act b){return a.f <b.f;}int GreedyActSelector(Act* s, int n, Act* A){int  m = 0, k =0;A[0] = s[0];for(m=1; m<n; ++m){if(s[m].s >= A[k].f){A[++k] = s[m];}}return k;}int main(){int n = 0,i=0;cout<<"输入活动个数: "<<endl;cin>>n;Act*arr = new Act[n];Act* A = new Act[n];cout<<"输入"<<n<<"个活动的开始和结束时间:"<<endl;for(i=0;i<n;++i)cin>>arr[i].s>>arr[i].f;sort(arr,arr+n,cmp);int k = GreedyActSelector(arr,n,A);cout<<"选择的活动:"<<endl;for(i=0;i<=k;++i)cout<<A[i].s<<","<<A[i].f<<endl;return 0;}</span>


区间着色问题,改了蛮久的,因为没有考虑清楚,每一个标注了true的跳过,从第一个false的开始,但是必须注意的是对该活动也要标注,记录在count中不然就不会跳出循环。

//贪心算法,活动选择问题typedef struct Act{int s;int f;bool flag;int r;}Act;bool cmp(Act a, Act b){return a.f <b.f;}int GreedyActSelector(Act* s, int n){int  m = 0,count=0, end=0, room =0;while(count<n){++ room;//再开辟新房间for(m=0;s[m].flag;++m);//找到第一个false,并对其进行分配s[m].flag = true;//标记已分配s[m].r = room;//写房间号end = s[m].f;//记录新的结束时间++ count;//已经分配房间的个数//cout<<"end "<<end<<"room "<<room<<"count "<<count<<endl;for(; m<n; ++m){if((s[m].s >= end) && (!s[m].flag)){s[m].flag = true;//标记已分配s[m].r = room;//写房间号end = s[m].f;//记录新的结束时间++ count;//已经分配房间的个数//cout<<"end "<<end<<"room "<<room<<"count "<<count<<endl;}}}cout<<room;return room;}int main(){int n = 0,i=0;cout<<"输入活动个数: "<<endl;cin>>n;Act*arr = new Act[n];cout<<"输入"<<n<<"个活动的开始和结束时间:"<<endl;for(i=0;i<n;++i){cin>>arr[i].s>>arr[i].f;arr[i].flag =false;}sort(arr,arr+n,cmp);int k = GreedyActSelector(arr,n);return 0;}



0 0
原创粉丝点击