Codeforces Round #448 (Div. 2) A. Pizza Separation

A. Pizza Separation
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Students Vasya and Petya are studying at the BSU (Byteland State University). At one of the breaks they decided to order a pizza. In this problem pizza is a circle of some radius. The pizza was delivered already cut into n pieces. The i-th piece is a sector of angle equal to ai. Vasya and Petya want to divide all pieces of pizza into two continuous sectors in such way that the difference between angles of these sectors is minimal. Sector angle is sum of angles of all pieces in it. Pay attention, that one of sectors can be empty.

Input
The first line contains one integer n (1 ≤ n ≤ 360) — the number of pieces into which the delivered pizza was cut.

The second line contains n integers ai (1 ≤ ai ≤ 360) — the angles of the sectors into which the pizza was cut. The sum of all ai is 360.

Output
Print one integer — the minimal difference between angles of sectors that will go to Vasya and Petya.

Examples
input
4
90 90 90 90
output
0
input
3
100 100 160
output
40
input
1
360
output
360
input
4
170 30 150 10
output
0
Note
In first sample Vasya can take 1 and 2 pieces, Petya can take 3 and 4 pieces. Then the answer is |(90 + 90) - (90 + 90)| = 0.

In third sample there is only one piece of pizza that can be taken by only one from Vasya and Petya. So the answer is |360 - 0| = 360.

In fourth sample Vasya can take 1 and 4 pieces, then Petya will take 2 and 3 pieces. So the answer is |(170 + 10) - (30 + 150)| = 0.

Picture explaning fourth sample:
这里写图片描述

Both red and green sectors consist of two adjacent pieces of pizza. So Vasya can take green sector, then Petya will take red sector.

题意:有两个人分披萨,披萨是一个规整的圆,问你他两分得披萨的角度之差最小是多少。
思路:日常看错题,一开始以为是随便找出差的最小值,wa一发后发现,要按照连续的角度找最小值。所以,在输入的时候就把值多复制一份放在数组的后面,这样就,无论怎么找都是连续的。然后,遍历数组,维护最小值。

#include<bits/stdc++.h>
using namespace std ;

int a[1000] ;

int main()
{
    //freopen("InputA.out" , "r" , stdin) ;
    int  n;
    cin >> n ;
    for(int i = 0 ; i < n ; i ++)
    {
        cin >> a[i] ;
        a[i+n] = a[i] ;  ///复制的数值
    }
    int ans = 360 ;
    for(int i = 0 ; i < n ; i ++)
    {
        int index = 0 ;
        int index1 = 0 ;
        for(int j = i ; j < n+i ; j ++)
        {
            index = index + a[j] ;
            if(index > 360)
            {
                break ;
            }
            index1 = 360 - index ;
            ans = min(ans , abs(index1 - index)) ; ///维护最小值
        }
    }
    cout << ans << endl ;
    return 0 ;
}

猜你喜欢

转载自blog.csdn.net/lewis_fehling/article/details/78684713