1 条题解
-
0
自动搬运
来自洛谷,原作者为

zbwer
AFO搬运于
2025-08-24 21:37:03,当前版本为作者最后更新于2019-07-26 21:44:28,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
/* Tips: 1.首先找到与第一头牛最远的牛的位置,即找到一个牛(pos)与1号牛的距离>=周长的一半 2.接着记录 pos之前的这头牛(pos-1) 3.显然pos这头牛到第一头牛的逆时针顺序是最大的,(pos-1)这头牛到第一头牛的顺时针距离是最大的 4.那我们在这二者之间取个最大值 5.接下来不断向前推进,第一头牛变为第二头牛,更新pos和(pos-1)到第二头牛的距离,再更新一下答案即可. 6.如果我们向前推进奶牛的时候,pos到当前推进到的奶牛的顺时针距离<周长的一半,那我们就向前推进pos即可 */Code:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define Mi return #define manchi 0 using namespace std; const int INF = 0x3f3f3f3f; const int N = 100000 +5 ; inline int read() { int num=0,w=1;char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch<='9' && ch>='0') num=(num<<1)+(num<<3)+ch-'0',ch=getchar(); Mi num*w; } int n,a[N],sum,ans; int main() { // freopen("circle.in","r",stdin); // freopen("circle.out","w",stdout); n=read(); for(register int i=1;i<=n;i++) a[i]=read(),sum+=a[i];//i-1 -> i int half_over=0,pos=0; for(register int i=1;i<=n;i++) { half_over+=a[i-1];//找到第一个超过一半周长的 if(half_over>sum/2){pos=i;break;}//记录此时位置 } int way=abs(sum-half_over); int way_=half_over-a[pos-1]; ans=max(way,way_); for(int i=1;i<=n;i++) { half_over-=a[i-1];//向前推进奶牛 while(half_over<=sum/2) { half_over+=a[pos+1];//要是pos不符合条件,那就向前推进pos pos++; } //更新答案 ans=max(ans,min(half_over,abs(sum-half_over))); ans=max(ans,min(half_over-a[pos-1],abs(sum-(half_over-a[pos-1])))); } printf("%d",ans); Mi manchi; } //2019-07-26 typed by zbwer //题目地址:https://www.luogu.org/problem/P2381
- 1
信息
- ID
- 1399
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者