題目鏈接:(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; }