【题解】Atcoder ABC432 C
思路
遇事不决先排个序。注意到如果要让所有人分得的糖果重量相等,那么糖更少的人需要的大糖更多。因每人分得糖果数量确定,所以总重量越大,每人需要的大糖数量就越多。为了让大糖总数最多,不妨给糖最少的人全分大糖,此时糖总重量就取到了上界。我们有了糖总重量,可以用二元一次方程组解出每个人需要的大糖数量,统计答案输出。如果不是正整数解,那么则无方案。
不过,该结论有一个漏洞:是否存在一种情况,使得糖最少的人不全分大糖有解,而全分大糖情况无解。我们考虑将糖最少的人的一颗小糖换成大糖会发生什么。将糖最少的人的一颗小糖换成大糖,相应地糖总重量增加了,其他的人也都需将一颗小糖换成大糖,该方案依然有解,直到糖最少的人的所有小糖都换成了大糖,方案一直有解。而且,其他人在换糖过程中将小糖耗尽的情况也不存在,因为他们的小糖数量不可能少余糖最少的人的小糖数量,否则他们的糖数量将少于糖最少的人。所以,如果糖最少的人不全分大糖有解,那么全分大糖的情况也一定有解。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,x,y,ans;
int a[N],sum;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>x>>y;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
sum=a[1]*y;
ans+=a[1];
for(int i=2;i<=n;i++){
int q;
if(((sum-(a[i]*x))<0)||((sum-(a[i]*x))%(y-x))){
cout<<-1;
return 0;
}
q=(sum-(a[i]*x))/(y-x);
ans+=q;
}
cout<<ans;
return 0;
}
\((sum-a[i]\times x)\div (y-x)\) 即加减消元所推出的式子。
时间复杂度为 \(O(n\log n)\)。

浙公网安备 33010602011771号