题目链接:(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; }