百度之星之F:百科蝌蚪团
来源:互联网 发布:网站源码下载3ggg 编辑:程序博客网 时间:2024/06/11 18:15
F:百科蝌蚪团
时间限制:
1000ms
内存限制:
65536kB
描述
百度百科有一支神奇的队伍,他们叫自己“百科蝌蚪团”。为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出了一个24小时制的时间表。例如:
1. 每个蝌蚪团成员工作时长相同;
2. 必须安排蝌蚪团成员在他们方便的时间段工作;
3. 蝌蚪团成员安排时间最小安排时间节点(开始工作或停止工作)为半小时,比如04:00或04:30,而不是04:15;
4. 蝌蚪团成员一天在百度百科工作的时间是有上限的,他们会根据自己的情况给出上限。
5. 在特定时间段内必须有一定数量的蝌蚪团成员工作,以保证百度百科不断的进步
请帮运营团队计算一下,能保持24小时稳定在岗的蝌蚪团最少成员的数量。如果有2个蝌蚪团成员工作结束,同时另2个蝌蚪团成员开始工作,这段时间都算有2各成员稳定在岗。
输入
输入有多组,每组测试数据以一个整数N开头(1 ≤ N ≤ 50),表示蝌蚪团的成员数。紧接着,我们会有N个数据块,每一个数据块对应了一名蝌蚪团成员的日程情况。
每个数据块以两个整数开始,分别为K(1 ≤ K ≤ 50)和M(1 ≤ M ≤ 1440),用空格隔开。K表示这个数据块对应蝌蚪团成员方便的时间段的数量,M表示这个成员愿意每天在百度百科工作的最长分钟数。接下去的K行中,每行包括两个时间,分别表示成“HH:MM”的格式,以空格分隔,分别对应了该蝌蚪团成员一个方便的时间段的开始时间、结束时间;例如09:00 10:00表明他在早上九点到十点的时间段是方便的,可以在百度百科工作。如果两个时间相同,则说明这个他全天都是方便的。
最后一组数据的N为0,表示输入结束。
输出
对于每组数据,输出为一个整数,占一行。表示能保持24小时稳定在岗的蝌蚪团最少成员的数量。
样例输入
5
1 720
18:00 12:00
1 1080
00:00 23:00
1 1080
00:00 20:00
1 1050
06:00 00:00
1 360
18:00 00:00
3
1 540
00:00 00:00
3 480
08:00 10:00
09:00 12:00
13:00 19:00
1 420
17:00 00:00
3
1 1440
00:00 00:00
1 720
00:00 12:15
1 720
12:05 00:15
0
样例输出
2
1
1
【答案未通过】
#include <iostream>#include <string>#include <vector>using namespace std;int main(void){ intblockNums = 0; intcountOfTimeSegment = 0; //k intmaxMinutesOfMember = 0; //m stringbeginTimeOfMember; //beginTime stringendTimeOfMember; //endTime int*pBlockArr = NULL; int*pMaxMinute = NULL; pair<string,string> timePairs; vector<pair<string,string> > tVec; vector<pair<string,string> >::iterator iter; boolbOnlyOne = false; intminMemberCnt = 0; //输出结果,最小成员数... while(cin >> blockNums ) { if(blockNums== 0) { break; } pBlockArr= new int[blockNums]; pMaxMinute= new int[blockNums]; for(int i=0; i< blockNums; i++ ) { cin>> pBlockArr[i] >> pMaxMinute[i]; if(pBlockArr[i] != 0) { for(int j = 0; j < pBlockArr[i]; j++) { cin>> beginTimeOfMember >> endTimeOfMember; timePairs= make_pair(beginTimeOfMember,endTimeOfMember); tVec.push_back(timePairs); iter= tVec.begin(); while( iter != tVec.end() ) { if(iter->first== iter->second) { minMemberCnt= 1; bOnlyOne= true; break; } ++iter; } } }//endif }//endfor if(!bOnlyOne) { intiSize = tVec.size(); cout<< "iSize = " << iSize << endl; inttempVal = 0; intiCnt = 0; for(int i = 0; i < iSize; i++ ) { if((tVec[i].first == "00:00") || (tVec[i].second == "00:00") ) { ++iCnt; tempVal+= pMaxMinute[i]; if(tempVal>= 24*60) { break; } } } minMemberCnt= iCnt; } cout<< minMemberCnt << endl; }//endwhile return0;}
【网友通过】
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #include<memory.h> #define maxn 102 #define MAX 0xfffffff int d[maxn],g[maxn][maxn],f[maxn][maxn],pre[maxn],map[maxn][maxn],sum[maxn],current[maxn]; int n,m,num,mm; struct node { int x,y; }seg[1000],mytime[1000]; int cmp(const node &a,const node &b) { return a.x<b.x; } void rev_bfs(int t) { int queue[maxn],flag[maxn]; int head,tail,i; memset(sum,0,sizeof(sum)); for (i=0;i<=n+49;++i) { d[i]=n+49; sum[n+49]++; } sum[n+49]--; sum[0]++; d[t]=0; queue[1]=t; flag[t]=1; head=1;tail=1; memset(flag,0,sizeof(flag)); while (head<=tail) { for (i=0;i<=n+49;++i) if (flag[i]==0&&g[i][queue[head]]>0) { queue[++tail]=i; d[i]=d[queue[head]]+1; sum[n+49]--; sum[d[i]]++; flag[i]=1; } head++; } } void augment(int s,int t) { int i,min; min=MAX; for (i=t;i!=s;i=pre[i]) if (g[pre[i]][i]<min) min=g[pre[i]][i]; for (i=t;i!=s;i=pre[i]) { g[pre[i]][i]-=min;; g[i][pre[i]]+=min; f[pre[i]][i]+=min; f[i][pre[i]]-=min; } } int retreat(int *u,int s) { int v,min; min=n+49; for (v=0;v<=n+49;++v) if (g[*u][v]>0&&d[v]<min) min=d[v]; sum[d[*u]]--; if ((sum[d[*u]])==0&&d[*u]<=n+49) return 0; d[*u]=min+1; sum[d[*u]]++; current[*u]=0; if (*u!=s) *u=pre[*u]; return 1; } void ISAP(int s,int t) { int u,v; rev_bfs(t); u=s; while (d[s]<n+50) { for (v=current[u];v<=n+49;v++) if (g[u][v]>0&&d[u]==d[v]+1) break; if (v<=n+49) { current[u]=v; pre[v]=u; u=v; if (u==t) { augment(s,t); u=s; } } else if(retreat(&u,s)==0) return; } } void solve() { int i,j,a,b,c,d,min,t,k,ans,max,st,en,temp; while(scanf("%d",&n)!=EOF) { if(!n) break; memset(map,0,sizeof(map));; for (i=1;i<=n;++i) { scanf("%d %d",&m,&t); map[48][i+48]=t/30; num = mm = 0; for(j=1;j<=m;++j) { scanf("%d:%d %d:%d",&a,&b,&c,&d); if (a==c && b==d) { for (k=0;k<48;++k) map[i+48][k]=1; continue; } if (!c && !d) { ++num; seg[num].x=a*60+b , seg[num].y=1440; } else if (a*60+b>c*60+d) { ++num; seg[num].x=a*60+b , seg[num].y=1440; ++num; seg[num].x=0 , seg[num].y=c*60+d; } else { ++num; seg[num].x=a*60+b , seg[num].y=c*60+d; } } if(num==0) continue; sort(seg+1,seg+num+1,cmp); st=seg[1].x; en=seg[1].y; seg[num+1].x=1500; seg[num+1].y=1600; for (j=2;j<=num+1;++j) { a=seg[j].x; b=seg[j].y; if (st<=a && a<=en&&en<b) en=b; else if(a>en) { mm++; mytime[mm].x=st , mytime[mm].y=en; st=a; en=b; } } for (j=1;j<=mm;++j) { a=mytime[j].x/60; b=mytime[j].x-60*a; c=mytime[j].y/60; d=mytime[j].y-60*c; if (a==c) { if (b==0&&d>=30) map[i+48][a*2]=1; } else { if (b>0&&b<=30) b=30; if (b>30) { a++; b=0; } if (d<30) d=0; if (d>30) d=30; while (a!=c||b!=d) { map[i+48][a*2+b/30]=1; b+=30; if (b==60) { a++; b=0; } } } } } max=MAX; for (j=0;j<48;++j) { temp=0; for (k=49;k<n+49;++k) if (map[k][j]>0) ++temp; if (temp<max) max=temp; } ans=0; for (j=1;j<=max;++j) { memset(g,0,sizeof(g)); memset(f,0,sizeof(f)); memset(current,0,sizeof(current)); for (i=0;i<=49+n;++i) for (k=0;k<=49+n;++k) g[i][k]=map[i][k]; for (i=0;i<48;++i) g[i][n+49]=j; ISAP(48,n+49); min=MAX; for (i=0;i<48;++i) if (f[i][n+49]<min) min=f[i][n+49]; if (min>ans) ans=min; } printf("%d\n",ans); } } int main(void) { solve(); return 0; }
2.我对时间的处理很简单,需要找到一个含有起点0:00和终点0:00的,存在就求其能工作时间之和,如果能大于24*60分钟,就等分配其工作,计数器加1。
3.不当之处希望和大家交流。算法这块需要深入呀!
- 百度之星之F:百科蝌蚪团
- 【2012百度之星/资格赛】F:百科蝌蚪团
- 【2012百度之星/资格赛】F:百科蝌蚪团
- 【2012百度之星资格赛】F:百科蝌蚪团
- 【百度之星资格赛】F:百科蝌蚪团
- 百度蝌蚪团
- 日语---之百度百科
- 蝌蚪之于水木清华
- 郝萌主之疯狂的蝌蚪
- 天空之城_百度百科
- [文摘20080424]百度百科 之 军衔
- 网店推广之百度百科推广
- C++之友元类--来自百度百科
- 2015年百度之星初赛(1) --- F 矩形面积
- 推广网站之如何利用百度百科推广网站?
- 随笔之~终于知道为什么程序员杜绝百度百科爱谷歌
- 关于产品的一些思考——百度之百度百科
- 营养百科之葡萄
- 求一棵二叉树中任意节点的后继节点(后继节点是指在中序遍历中紧随其后的节点)
- 超市找零简单算法
- 深入理解C语言指针的奥秘
- iphone隐藏,渐显Status Bar的方法
- 全排列(可排除重复)
- 百度之星之F:百科蝌蚪团
- UIViewAnimation使用简单说明
- 测试基础知识--测试新手入门篇
- JDK自带的轻量级HTTP Server进行加载。
- 层次聚类方法
- ios 播放声音和震动
- 学习Spring必学的Java基础知识(6)----ThreadLocal
- UINavigationController和UITabBarController共存的例子
- 学校里学不到的东西(一)