洛谷P2381 圆圆舞蹈
P2381 圆圆舞蹈
题目描述
熊大妈的乃修在时针的带领下,围成了一个圆圈舞蹈,由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛件的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
输入输出格式
输入格式:
第一行一个整数N,表示有N只奶牛。(2<=N<=100000)
接下2-N+1行,第i行有一个数,表示第i-1头奶牛顺时针到第i头奶牛的距离。(1<=距离<=maxlingint,距离和<=maxlongint)
第N+1行的数表示第N头奶牛顺时针到第1头奶牛的距离。
输出格式:
一行,表示最大距离。
输入输出样例
Crile.in
5
1
2
3
4
5
Crile.out
7 Solution
做法1:
记录前缀和,可知前缀和是递增的,枚举起点,我们不难二分一个"中点"
中点左边的点距离小于半个周长,右边的点距离大于半个周长,然后用终点顺、逆时针距离最小值更新答案即可。
复杂度O(nlogn)
做法2:
记录前缀和sum,总长度Len
于是从第一头奶牛开始,找到l,r两只牛,l <= r 这里从1开始
不难发现当距离小于总长度一半的时候,我们需要去找l, r + 1
当距离大于总长度一半的时候,我们需要去找l + 1, r 一定优于l + 1, r + 1
这样省去了很多无用的l,r
乱搞一下就可以了
复杂度O(n) Code
第二种做法
#include <bits/stdc++.h>
const int MAXN = 100000 + 10;
inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}
inline int min(int a,int b){return a > b ? b : a;}
inline int max(int a,int b){return a > b ? a : b;}
int n;
int sum[MAXN],num[MAXN],len;
int ans;
int main()
{
read(n);
for(int i = 2;i <= n;i ++)
{
read(num[i]);
sum[i] = sum[i - 1] + num[i];
len += num[i];
}
read(num[1]);len += num[1];sum[n + 1] = sum[n] + num[1];
int l = 1, r = 1;int mid = len >> 1;
while(l <= n + 1 && r <= n + 1)
{
if(l == r)
{
r ++;
}
else if(sum[r] - sum[l] <= mid)
{
ans = max(ans, sum[r] - sum[l]);
r ++;
}
else if(sum[r] - sum[l] > mid)
{
ans = max(ans, min(sum[r] - sum[l], mid - sum[r] + sum[l]));
l ++;
}
}
printf("%d", ans);
return 0;
}
第一种做法
#include <bits/stdc++.h>
const int MAXN = 300000 + 10;
inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}
inline int min(int a,int b){return a > b ? b : a;}
inline int max(int a,int b){return a > b ? a : b;}
int n;
int sum[MAXN >> 1],len;
int ans;
inline int erfen(int l, int r, int p)
{
int mid = l + (r - l);
while(l < r)
{
mid = l + ((r - l) >> 1);
if(p <= sum[mid])r = mid;
else l = mid + 1;
}
return l;
}
//枚举起始点i,二分找j,令s[j] - s[i] <= s / 2 这样j 和 j-1 两个点二选一
//处理环就多复制一层
int main()
{
read(n);
for(int i = 1;i <= n;i ++)
{
read(sum[i]);
len += sum[i];
sum[i] += sum[i - 1];
}
for(int i = 1;i <= n;i ++)
{
sum[i + n] = len + sum[i];
}
for(int i = 1;i <= 2 * n;i ++)
{
int tmp = erfen(1, 2 * n, sum[i] + (len >> 1));
ans = max(ans, min(sum[tmp] - sum[i], len - sum[tmp] + sum[i]));
ans = max(ans, sum[tmp - 1] - sum[i]) ;
}
printf("%d", ans);
return 0;
}
洛谷P2381 圆圆舞蹈的更多相关文章
- 洛谷——P2381 圆圆舞蹈
P2381 圆圆舞蹈 题目描述 熊大妈的乃修在时针的带领下,围成了一个圆圈舞蹈,由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时针 ...
- P2381 圆圆舞蹈
题意:一个圆,上面有n头牛(卧槽) 给出相邻两头牛顺时针的距离 问两只最远的牛的距离(min(顺时针距离,逆时针距离)) 最远距离一定$\le$距离和/2 先求个前缀和 那么问题转化为:找到 $s_j ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
- 洛谷 P3654 First Step (ファーストステップ)
洛谷 P3654 First Step (ファーストステップ) https://www.luogu.org/problemnew/show/P3654 题目描述 可是……这个篮球场,好像很久没有使用过 ...
- 洛谷 P2253 好一个一中腰鼓! 题解
P2253 好一个一中腰鼓! 题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:"忽一人 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- CPU中的主要的寄存器
寄存器 名为寄存器的存储电路. 8种16位寄存器 AX accumulator 累加寄存器 CX counter 计数寄存器 DX data 数据寄存器 BX base 基址寄存器 SP stack ...
- 《DSP using MATLAB》Problem 8.4
今天是六一儿童节,陪伴不了家人,心里思念着他们,看着地里金黄的麦子,远处的山,高高的天 代码: %% ------------------------------------------------- ...
- Mybatis-configuration 配置-settings配置
设置参数 描述 有效值 默认值 cacheEnabled 这个配置使全局的映射器启用或禁用 缓存. true | false true lazyLoadingEnabled 全局启用或禁用延迟加载.当 ...
- Django入门之基础篇01
这是第一篇Django(花音:浆够)入门博客,学习Django的初衷是为了开发自己的个人小小网站(虽然有了博客园,还是想建立自己的博客,因为自主定制,香香香~!)
- <数据库>MySQL补充( 查询)
show create table 表名 \G;(查看创建的属性) alter table 表名 auto_increment=xx;(修改自增起始值) set session auto_increm ...
- vue 使用QRcode生成二维码或在线生成二维码
参考:https://blog.csdn.net/zhuswy/article/details/80267748 1.安装qrcode.js npm install qrcodejs2 --save ...
- Angular+Bootstrap3导航菜单
Angular+Bootstrap3导航菜单 AngularJS体验式编程系列文章,将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀 ...
- C++中如何实现像Java中接口功能--C++抽象类(纯虚函数,虚函数)
在Java中定义个接口,之后可以定义不同的类来实现接口,如果有个函数的参数为这个接口的话,就可以对各自的类做出不同的响应. 如: interface animal { public void info ...
- 路飞学城-Python爬虫集训-第三章
这个爬虫集训课第三章的作业讲得是Scrapy 课程主要是使用Scrapy + Redis实现分布式爬虫 惯例贴一下作业: Python爬虫可以使用Requests库来进行简单爬虫的编写,但是Reque ...
- Selenium浏览器自动化测试使用(1)
Selenium - 介绍 Selenium是一个开源的和便携式的自动化软件测试工具,用于测试Web应用程序有能力在不同的浏览器和操作系统运行.Selenium真的不是一个单一的工具,而是一套工具,帮 ...