您的位置:首页 > 其它

Codeforces 610B Vika and Squares 【计数 数学基础】

2016-01-01 18:41 507 查看
B. Vika and Squares

time limit per test
2 seconds

memory limit per test
256 megabytes

input
standard input

output
standard output

Vika has n jars with paints of distinct colors. All the jars are numbered from 1 to n and
the i-th jar contains ai liters
of paint of color i.

Vika also has an infinitely long rectangular piece of paper of width 1, consisting of squares of size 1 × 1.
Squares are numbered 1, 2, 3and
so on. Vika decided that she will start painting squares one by one from left to right, starting from the square number 1 and some arbitrary
color. If the square was painted in color x, then the next square will be painted in color x + 1.
In case of x = n, next square is painted in color 1.
If there is no more paint of the color Vika wants to use now, then she stops.

Square is always painted in only one color, and it takes exactly 1 liter of paint. Your task is to calculate the maximum number of squares that
might be painted, if Vika chooses right color to paint the first square.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 200 000) —
the number of jars with colors Vika has.

The second line of the input contains a sequence of integers a1, a2, ..., an (1 ≤ ai ≤ 109),
where ai is
equal to the number of liters of paint in the i-th jar, i.e. the number of liters of color i that
Vika has.

Output

The only line of the output should contain a single integer — the maximum number of squares that Vika can paint if she follows the rules described above.

Sample test(s)

input
5
2 4 2 3 3


output
12


input
3
5 5 5


output
15


input
6
10 10 10 1 10 10


output
11


Note

In the first sample the best strategy is to start painting using color 4. Then the squares will be painted in the following colors (from left
to right): 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5.

In the second sample Vika can start to paint using any color.

In the third sample Vika should start painting using color number 5.

题意:给定n种颜料以及每种颜料的数量。涂色原则1,相邻颜色不同;2,若第i块涂颜料x,那么i+1块涂颜料x+1(n的话涂1)。问你最多可以涂多少块。

思路:首先求整体循环数即所有颜料数量最小的Min,全减去后求最长连续的非0段len。结果就是Min * n + len。

AC代码:注意左右端点,还有数据会爆int

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <string>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define MAXN (200000+10)
#define MAXM (500000)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.2lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define PI acos(-1.0)
using namespace std;
int a[MAXN];
int main()
{
int n; Ri(n);
LL ans = 0;
int Min = INF;
for(int i = 0; i < n; i++)
{
Ri(a[i]);
Min = min(Min, a[i]);
}
ans = 1LL * Min * n;
int len = 0, temp = 0;
for(int i = 0; i < n; i++)
{
a[i] -= Min;
if(a[i] == 0)
{
if(len)
temp = max(temp, len);
len = 0;
}
else
len++;
}
if(len)
temp = max(temp, len);
int num = 0, i = 0;
while(a[i] && i < n) i++, num++;
i = n-1;
while(a[i] && i >= 0) i--, num++;
temp = max(temp, num);
Pl(ans + temp);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: