列表

详情


NC218905. PullingTheirWeight

描述


To save money, Santa Claus has started hiring other animals besides reindeer to
pull his sleigh via short term 'gig' contracts. As a result, the actual
animals that show up to pull his sleigh for any given trip can vary greatly in
size.

Last week he had 2 buffalo, 37 voles and a schnauzer. Unfortunately, both
buffalo were hitched on the left side and the entire sleigh flipped over in
mid-flight due to the weight imbalance.

To prevent such accidents in the future, Santa needs to divide the animals for
a given trip into two groups such that the sum of the weights of all animals in
one group equals the sum of the weights of all animals in the other. To make
the hitching process efficient, Santa is seeking an integer target weight t
such that all animals that are lighter than t go in one group and those
heavier than t go into the other. If there are multiple such t, he wants
the smallest one. There's one small wrinkle: what should be done if there some
animals have weight exactly equal to t? Santa solves the problem this way: if
there are an even number of such animals, he divides them equally among the two
groups (thus distributing the weight evenly). But if there are an odd number of
such animals, then one of those animals is sent to work with the elves to make
toys (it is not put in either group), and the remaining (now an even number)
are divided evenly among the two groups.

输入描述

Input describes a list of animals' weights. The first line contains an integer
m (), indicating the number of animals. The next m lines
each have a positive integer. These are the weights of the animals (in ounces).
Animals weighing more than ounces are too big to pull the sleigh so
no given weight will exceed this maximum.

输出描述

Output the smallest integer target weight t, as described above. It's
guaranteed that it is possible to find such an integer.

示例1

输入:

4
3
6
1
2

输出:

4

示例2

输入:

4
11
8
3
10

输出:

10

示例3

输入:

2
99
99

输出:

99

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.9) 解法, 执行用时: 186ms, 内存消耗: 7288K, 提交时间: 2021-03-07 14:21:51

n = int(input())
li = []
for i in range(n):
    li.append(int(input()))
li.sort()
l = 0
r = len(li) - 1
l_s = 0
r_s = 0
while l < r:
    l_s += li[l]
    r_s += li[r]
    while l_s < r_s and l < r:
        l += 1
        l_s += li[l]
    l += 1
    r -= 1
if li[l] == li[r]:
    print(li[l])
else:
    print(li[l-1] + 1)

C++(clang++11) 解法, 执行用时: 31ms, 内存消耗: 504K, 提交时间: 2021-03-07 21:28:07

#include<bits/stdc++.h>
using namespace std;
int a[100005],sum,ans,sum1;

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		a[x]++;
		sum+=x;
	}
	for(int i=1;i<=20000;i++){
		sum1+=a[i-1]*(i-1);
		if(sum1*2==(sum-a[i]*i)) {cout<<i<<endl;return 0;}
	} 
 } 

上一题