Dinner
【问题描述】
清儿今天请好朋友们吃饭,一共 N 个人坐在坐在圆桌旁。
吃饭的第一步当然是点餐了。服务员拿来了 M 份菜单。第 i 个人阅读菜单并点出自己喜欢的菜需要花费时间 T[i]。
当一个人点完菜之后,就会把菜单传到他右手边的第一个人。
M 份菜单是同时发出的,每个菜单只能同时被一个人阅读。
清儿希望知道如何分发菜单,才能让点餐的总时间花费最少呢?
【输入格式】
输入文件名为 dinner.in
输入第一行是 N 和 M,表示人数和菜单数
输入第二行,N 个数,表示每个人点餐所需要的时间。
【输出格式】
输出文件名为 dinner.out
输出一个整数表示点餐花费的最小时间。
【样例一输入】
3 2
1 5 10
【样例一输出】
10
【样例二输入】
4 2
1 2 3 4
【样例二输出】
5
HINT:
对于 20%的数据,n<=100,m<=100.
对于 60%的数据,n<=10000,m<=100.
对于 100%的数据,n<=50000,T[i]<=600,m<=3000.
首先理清题意,“当一个人点完菜之后,就会把菜单传到他右手边的第一个人”,“点完菜”是一个状态,也就是说在点完菜之前(点菜时)如果有菜单传递过来,他是不会传的。等到当他点完菜时,他会把两个菜单都传递给下一个人,但下个人只会看一个菜单,所以多出来的那个菜单对答案没有影响,也就是说一个菜单的影响范围最多从其本身开始位置到达下一个菜单开始的位置减一,也就是一段区间。从而问题就转化为了把一个环分成 \(m\) 段,使得和最大的那个区间和尽量小,听起来像是二分。题目问所求的是一个环,怎么办?倍长序列即可。这样就转换成了最经典的二分了,但考虑到时间复杂度 \(O(n^2log_2n)\) ,怎么来的?二分一个答案 \(O(log_2n)\),枚举开始节点\(O(n)\),check \(O(n)\)。考虑怎么优化?
标签:Count,输出,菜单,样例,点餐,完菜,输入 来源: https://www.cnblogs.com/wwlwQWQ/p/11396243.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。