题目描述

清儿今天请好朋友们吃饭,一共$N$个人坐在坐在圆桌旁。
吃饭的第一步当然是点餐了。服务员拿来了$M$份菜单。第$i$个人阅读菜单并点出自己喜欢的菜需要花费时间$T_i$。
当一个人点完菜之后,就会把菜单传到他右手边的第一个人。
$M$份菜单是同时发出的,每个菜单只能同时被一个人阅读。
清儿希望知道如何分发菜单,才能让点餐的总时间花费最少呢?


输入格式

输入第一行是$N$和$M$,表示人数和菜单数。
输入第二行,$N$个数,表示每个人点餐所需要的时间。


输出格式

输出一个整数表示点餐花费的最小时间。


样例

样例输入1:

3 2
1 5 10

样例输出1:

10

样例输入2:

4 2
1 2 3 4

样例输出2:

5


数据范围与提示

对于$20\%$的数据,$n\leqslant 100$。
对于$60\%$的数据,$n\leqslant 10,000$。
对于$100\%$的数据,$n\leqslant 50,000,T_i\leqslant 600$。


题解

刚看到提有些麻木,显然枚举从那个点开始传菜单会$T$到飞起,那么我们就想怎么改变方式。

发现我们可以二分答案,也就是时间,然后在$judge$的时候枚举起点,挨个看,直到时间超出我们现在所二分的时间就在那个点下发下一个菜单,下发一圈之后,需要下发的菜单跟有的菜单做比较即可。

这时候我们的时间复杂度是$\Theta(\log (n\times T)\times n\times m)$,显然还是会超时(虽说数据没有说$m$有多大,但是好象是$2333$)。

那么我们接着考虑优化,显然只能在$judge$函数中进行优化,在下发菜单的时候我们没有必要一个一个的找,可以利用二分,至于如何利用呢?

我们可以考虑,先预处理出来$T_i$的前缀和,注意它是一个环,对于环的题最常用的做法就是将其复制一倍,我们直接让前缀和做差即可完成二分查找。

时间复杂度:$\Theta(\log (n\times T)\times n\times \log m)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200000];
int maxn;
int ans;
int jump(register int lft,register int rht,register int x)
{
int flag=lft-1,res=flag;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(a[mid]-a[flag]<=x){res=mid;lft=mid+1;}
else rht=mid-1;
}
return res;
}
bool judge(register int x)
{
register int res;
for(register int i=1;i<=n;i++)
{
res=1;
if(a[i]>x)break;
for(register int j=i;j<=i+n-i;j++)
{
j=jump(j,i+n-1,x);
if(j<i+n-1)res++;
if(res>m)goto nxt;
}
return 1;
nxt:;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
a[n+i]=a[i];
}
for(register int i=1;i<=(n<<1);i++)
a[i]+=a[i-1];
register int lft=maxn,rht=a[n];
while(lft<=rht)
{
register int mid=(lft+rht)>>1;
if(judge(mid))
{
rht=mid-1;
ans=mid;
}
else lft=mid+1;
}
cout<<ans<<endl;
return 0;
}

rp++

[CSP-S模拟测试]:Dinner(二分)的更多相关文章

  1. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  2. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  3. csp-s模拟测试96

    csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...

  4. csp-s模拟测试91

    csp-s模拟测试91 倒悬吃屎的一套题. $T1$认真(?)分析题意发现复杂度不能带$n$(?),计划直接维护答案,考虑操作对答案的影响,未果.突然发现可以动态开点权值线段树打部分分,后来$Tm$一 ...

  5. csp-s模拟测试87

    csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  8. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  9. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

随机推荐

  1. laravel使用artisan报错SQLSTATE[42S02]: Base table or view not found: 1146

    说明你在应用初始化阶段使用到了数据库层面的东西,然而当时数据库不存在这个表/字段,所以会报错 需要在初始化比如 config 目录配置中,使用了数据库,在使用前需要添加一层判断,如果不存在 你需要用到 ...

  2. VGA时序及其原理(转载)

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信 ...

  3. altium笔记转载

    原理图的设计 1.左键单击元器件按住space键可以将其旋转,按X键左右旋转:按Y键上下旋转. 2.智能粘贴:Edit àsmart paste . 3.屏障:compile mask(编译时被屏障的 ...

  4. Websocket如何建立连接

    前面提到,WebSocket复用了HTTP的握手通道.具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议.协议升级完成后,后续的数据交换则遵照WebSocket的协议. 1.客户 ...

  5. vue-router路由如何实现传参

    tip: 用params传参,F5强制刷新参数会被清空,用query,由于参数适用路径传参的所以F5强制刷新也不会被清空.(传参强烈建议适用string) 也可以选用sessionstorage/lo ...

  6. OuterXml和InnerXml(2)

    官方例子:https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.outerxml.aspx using System; using S ...

  7. xshell输入字母空格间距变大

    按一下shift+空格(全角/半角转换的快捷键,引起的问题)

  8. html/css中BFC的开启、关闭、作用

    什么是BFC BFC是什么并不重要.重要的是开启它干嘛?以及如何开启它 根据W3C的标准,在页面中元素都一个隐含的属性叫做Block Formatting Context(块级 格式化 环境)简称BF ...

  9. C# XML 解析包含特殊字符的内容

    xml结构会解析一些特殊字符,特别是& <    ,导致XmlDocument 解析错误 解决方法:将内容放在<![CDATA[ ]]>中,例如<![CDATA[2]] ...

  10. 使用docxtemplater来处理word模板

    工作中遇到需要根据不同数据来处理模板word的情况,网上搜索了一番之后,找到了一个叫做docxtemplater的库,使用起来非常便携,也十分满足此次的需求. 这次就来记录一下docxtemplate ...