AtCoder Beginner Contest 067 C - Splitting Pile

題目鏈接:(http://abc067.contest.atcoder.jp/tasks/arc078_a )

題意:n個卡片上有數字,從上到下依次取走一些卡片,和爲x,剩餘的數字之和爲y,然後求|x-y|的最小值。

解題思路:前綴和。用a[i]表示前i個數的和。然後列舉分別去掉前1個數,前2個數……前n-1個數(每個人都要至少有一張牌,所以不可能去掉前n個數),之後求x和y的差值的絕對值的最小值。

易錯:
1. 理解題意,從上到下的取數,不可以隨意取;
2. 兩個數的差值,即在去掉數字的同時就計算出來了。abs(a[n]-a[i]-a[i])。

代碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>

using namespace std;
#define ll long long const int maxn = 2*100000+5; ll a[maxn];

int main() {
    int n;
    int i;
    ll minn,temp;

    while(scanf("%d",&n) == 1)
    {
        a[0]=0;
        for(i = 1;i <= n;i++)
        {
            scanf("%lld",&temp);
            a[i] = a[i-1] + temp;
        }
        minn = abs(a[n]-a[1]-a[1]);
        for(i = 2;i < n;i++)
        {
            minn = min(minn,abs(a[n]-a[i]-a[i]));
        }
        printf("%lld\n",minn);
    }

    return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章