Pulling Their Weight(训练赛)
题意:输入n个数,分为两组,要求两组数的和相等,给定一个数t,要求t比一组的全部数大,比另一组的全部数小,找出最小的t。tip:当t和n个数中的数有相同时,如果个数为偶数,就把他们分别分到两组,如果个数为奇数,就剔除一个,变成偶数,按偶数处理。
题解:先排序,然后用前缀和记录对应区间的和。如果遍历到某个前缀和的2倍正好是所有数的和,那么这个前缀和对应的数+1(最小的t),就是想要的答案,
如果有两个相同元素,那就是这个前缀和对应的a值(因为偶数不会被踢)。还有当某个前缀和*2大于总和,就把这个数作为t。
accode:
int n, a[100010], sum[100010],ans;
int main()
{
memset(sum, 0, sizeof(sum));
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a+1, a + n+1);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+ a[i];
for (int i = 1; i <= n; i++)
{
if (sum[i] * 2 > sum[n])
{
ans = a[i];
break;
}
else if (sum[i] * 2 == sum[n])
{
if (a[i] == a[i + 1])
{
ans = a[i];
break;
}
else
{
ans = a[i] + 1;
break;
}
}
}
cout << ans;
return 0;
}