T1 圆圈舞蹈

题目

【题目描述】

熊大妈的奶牛在时针的带领下,围成了一个圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。

奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。

告诉你相邻个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。

【输入格式】

第一行一个整数N,表示有N只奶牛。

接下来2~N+1行,第I行有一个数,表示第I-1头奶牛顺时针到第I头奶牛的距离。

第N+1行的数表示第N头奶牛顺时针到第1头奶牛的距离。

【输出格式】

一行,表示最大距离。

【输入样例】

5

1

2

3

4

5

【输出样例】

7

【数据规模】

2<=N<=100000,

1<=距离<=maxlongint,距离和<=maxlongint。

解析

分析一下题目,多试几组数据,不难发现,其实我们并不需要知道所有牛之间的距离,

只需要知道对于每头牛来说,离它最远的牛有多远,实际实现时,我们需要求出每头牛顺时针与逆时针离它最远的牛。

这里引用一下大佬的解释:

长乐培训Day5

如图,对于枚举的第一头牛A,找到离它最远的牛B,

当我们沿顺时针枚举第二头牛C时,离C最远的牛不可能是图中红色区域的牛了,

所以我们只需要将B沿顺时针枚举,当蓝色部分的距离小于红色部分时枚举停止,

因为此时蓝色部分的牛不可能是离C最远的牛了。

这个算法是沿着圈绕了一圈,时间复杂度为O(n),足以AC。

Code

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100005;
int ans, a[MAXN], b[MAXN], n, i, j, k, tot, t;
int main()
{
    //freopen("circle.in", "r", stdin);
    //freopen("circle.out", "w", stdout);
    cin >> n;
    for(i = 1; i <= n; i ++)
        scanf("%d", &a[i]);
    for(i = 1; i <= n; i ++)
        tot += a[i];
    j = 2;
    t = a[1];
    for(i = 1; i <= n; i ++)
    {
        while (min(t, tot - t) <= min(t + a[j], tot - t - a[j]) && j < n) j ++, t += a[j - 1];
        ans = max(ans, min(t, tot - t));
        t -= a[i];
    }
    cout << ans << endl;
    //fclose(stdin); fclose(stdout);
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
  • 2022-12-23
  • 2021-10-09
  • 2022-01-04
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案