题解 | #数的选择#
数的选择
https://www.nowcoder.com/practice/12f72e06fc424e4d9c685cd89f2bed36
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin>>n; vector<int> nums(n); for(int i=0;i<n;i++) cin>>nums[i]; sort(nums.begin(),nums.end()); long long lsum=nums[0],rsum=0; for(int i=1;i<n-i;i++){ lsum+=nums[i]; rsum+=nums[n-i]; if(rsum>lsum){ cout<<i<<endl; return 0; } } cout<<-1<<endl; return 0; } // 64 位输出请用 printf("%lld")
先排序,左侧前i+1项的和lsum即为集合B元素个数为i+1时的最小和,右侧前i项的和rsum即为集合A元素个数为i时的最大和。当rsum>lsum时,输出i即可。注意,最容易出现纰漏的地方在于:所求的和会超出int型范围,应当定义为long long型。不然会出现错误!