Loading

【题解】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)\)

posted @ 2025-12-12 22:23  Seqfrel  阅读(3)  评论(0)    收藏  举报