[TOJ 2663] Concert Hall Scheduling
2015-08-18 19:46
417 查看
You are appointed director of a famous concert hall, to save it from bankruptcy. The hall is very popular, and receives many requests to use its two fine rooms, but unfortunately the previous director was not very efficient, and it has been losing money for
many years. The two rooms are of the same size and arrangement. Therefore, each applicant wishing to hold a concert asks for a room without specifying which. Each room can be used for only one concert per day.
In order to make more money, you have decided to abandon the previous fixed price policy, and rather let applicants specify the price they are ready to pay. Each application shall specify a period [i,
j] and an asking price w, where i and j are respectively the first and last days of the period (1 ≤
i ≤ j ≤ 365), and w is a positive integer in yen, indicating the amount the applicant is willing to pay to use a room for the whole period.
You have received applications for the next year, and you should now choose the applications you will accept. Each application should be either accepted for its whole period or completely rejected. Each concert should use the same room during the whole applied
period.
Considering the dire economic situation of the concert hall, artistic quality is to be ignored, and you should just try to maximize the total income for the whole year by accepting the most profitable applications.
n, the number of applications in the data set. Then, it is followed by
n lines, each of which represents one application with a period [i,
j] and an asking price w yen in the following format.
i j w
A line containing a single zero indicates the end of the input.
The maximum number of applications in a data set is one thousand, and the maximum asking price is one million yen.
many years. The two rooms are of the same size and arrangement. Therefore, each applicant wishing to hold a concert asks for a room without specifying which. Each room can be used for only one concert per day.
In order to make more money, you have decided to abandon the previous fixed price policy, and rather let applicants specify the price they are ready to pay. Each application shall specify a period [i,
j] and an asking price w, where i and j are respectively the first and last days of the period (1 ≤
i ≤ j ≤ 365), and w is a positive integer in yen, indicating the amount the applicant is willing to pay to use a room for the whole period.
You have received applications for the next year, and you should now choose the applications you will accept. Each application should be either accepted for its whole period or completely rejected. Each concert should use the same room during the whole applied
period.
Considering the dire economic situation of the concert hall, artistic quality is to be ignored, and you should just try to maximize the total income for the whole year by accepting the most profitable applications.
Input
The input has multiple data sets, each starting with a line consisting of a single integern, the number of applications in the data set. Then, it is followed by
n lines, each of which represents one application with a period [i,
j] and an asking price w yen in the following format.
i j w
A line containing a single zero indicates the end of the input.
The maximum number of applications in a data set is one thousand, and the maximum asking price is one million yen.
Output
For each data set, print a single line containing an integer, the maximum total income in yen for the data set.Sample Input
4 1 2 10 2 3 10 3 3 10 1 3 10 6 1 20 1000 3 25 10000 5 15 5000 22 300 5500 10 295 9000 7 7 6000 8 32 251 2261 123 281 1339 211 235 5641 162 217 7273 22 139 7851 194 198 9190 119 274 878 122 173 8640 0
Output for the Sample Input
30 25500 38595 将每天拆点成开始和结束,使用房间的情况当作流量,正常情况什么也不做直接向下一天连边,无费用,或者是从某一天的开始到另一天的结尾表示占用此房间,费用为收益,做最大费用最大流即可。#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int inf=1010101010; int n,m; struct edge { int v,c,w,next; }e[150000]; int head[40000],cnt; void addedge(int u,int v,int c,int w) { e[cnt].v=v; e[cnt].c=c; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt++; e[cnt].v=u; e[cnt].c=0; e[cnt].w=-w; e[cnt].next=head[v]; head[v]=cnt++; } int a[40000],b[40000]; int S,T; int dis[100010]; bool vis[100010]; int pre[100010]; int pos[100010]; int gao() { int ans=0; while(1){ for(int i=0;i<=T;i++) dis[i]=-1,vis[i]=0,pre[i]=i,pos[i]=0; queue<int> q; dis[S]=0; q.push(S); vis[S]=1; int u,v,w,c; while(!q.empty()) { u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(e[i].c>0&&dis[v]<dis[u]+e[i].w) { pre[v]=u; pos[v]=i; dis[v]=dis[u]+e[i].w; //cout<<u<<" "<<v<<dis[v]<<endl; if(!vis[v]) { vis[v]=1; q.push(v); } } } } //cout<<"kk"<<endl; if(dis[T]==-1) break; //cout<<dis[T]<<"jj"<<endl; int sum=inf; for(u=T;u!=S;u=pre[u]) { c=e[pos[u]].c; sum=min(sum,c); } for(u=T;u!=S;u=pre[u]) { e[pos[u]].c-=sum; e[pos[u]^1].c+=sum; ans+=sum*e[pos[u]].w; } } return ans; } int main() { int t; //cin>>t; while(cin>>n,n) { memset(head,-1,sizeof(head)); cnt=0; S=0;T=366; for(int i=0;i<366;i++) addedge(i,i+1,2,0); int x,y,w; while(n--) { cin>>x>>y>>w; addedge(x,y+1,1,w); } cout<<gao()<<endl; } }
相关文章推荐
- Raw-OS互斥的源代码分析的量的Mutex
- Linux下更改系统时区及时间
- 学习书籍
- HDOJ 5399.Too Simple(2015多校-9的1004)
- hdu 5402 ,Travelling Salesman Problem,2015多校联合训练赛#9
- AE开发之路(一)
- 通过网络获取图片并缓存
- SS2H项目开发历程
- 欢迎使用CSDN-markdown编辑器
- poj-1426 Find The Multiple
- 【Cocos2dx】Windows平台下Cocos2dx 2.x的下载、安装、配置,打造自己的Helloworld
- 浅谈数据结构-树和二叉树之间关系
- 自定义微信图文模板注意事项整理
- Objective-C:字符串的反转Reverse
- 黑马程序员——视频学习过程3
- Android插件技术——(三)加载未安装apk
- [TOJ 3541] Counting Sequences
- Android目录结构
- 学习小结
- 归档test