zoukankan      html  css  js  c++  java
  • Codeforces Round #448 (Div. 2) A. Pizza Separation【前缀和/枚举/将圆(披萨)分为连续的两块使其差最小】

    A. Pizza Separation
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard 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 toai. 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.

    【题意】:将圆分为连续的两块使其差最小。

    【分析】:因为是连续区间并且区间可以为空,3个for枚举t或者前缀和或者尺取。去掉连续的话就是01背包变形:http://blog.csdn.net/pegasuswang_/article/details/25081783

    【代码】:

    #include <bits/stdc++.h>
    
    using namespace std;
    int a[400],sum[400];
    int main()
    {
        int n;
        int ans=360;
    
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum[i]=a[i]+sum[i-1];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i;j<n;j++)//t-(360-t)=2*t-360,t为区间所取值,因为是连续区间并且区间可以为空,3个for枚举t或者前缀和或者尺取
            {
                ans=min(ans,abs(2*(sum[j]-sum[i-1])-360));
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    前缀和求连续区间和
    #include <bits/stdc++.h>
    
    using namespace std;
    int a[1000],sum;//环的话 数组起码2倍大
    int main()
    {
        int n;
        int ans=360;
    
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            a[i+n]=a[i];
        }
        for(int i=0;i<n;i++)
        {
            sum=0; //注意置0的位置
            for(int j=i;j<i+n;j++)
            {
                sum+=a[j];
                ans=min(ans,abs( 2*sum-360) );
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    
    /*
    输入数据直接复制了一遍放到后面,然后枚举拿的起点i,拿的终点j。然后计算拿了多少,差值是多少。
    */
    复制数组模拟环
  • 相关阅读:
    2019-2020-1 20175301 20175305 20175318 实验三 实时系统
    2019-2020-2-20175301 20175305 20175318-实验二固件程序设计
    2019-2020-1 20175301 20175305 20175318 实验一 开发环境的熟悉
    2019-2020-1 20175305 《信息安全系统设计基础》第4周学习总结
    20175305 《信息安全系统设计基础》第1-2周学习总结
    2018-2019-2 20175305 实验五《网络编程与安全》实验报告
    2018-2019-2 20175305实验四《Android程序设计》实验报告
    20175305张天钰《java程序设计》第十一周学习总结
    使用 JDK11 遇到的问题
    Oracle 从 dual 表中查询返回多行记录
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7903036.html
Copyright © 2011-2022 走看看