专栏文章
题解:AT_abc432_c [ABC432C] Candy Tribulation
AT_abc432_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min2hcoh
- 此快照首次捕获于
- 2025/12/01 19:29 3 个月前
- 此快照最后确认于
- 2025/12/01 19:29 3 个月前
注:本题解无 AI 生成。
1.思路
1-1.总重量的确定
我们考虑贪心。
为了使选择的大糖果数最多,我们可以让拥有糖果数最少的人全拿大糖果,这样能使总重量最大,从而使别的人有更多操作空间。
1-2.确定总数
现在确定了总重量,如何快速确定 个人的大糖果总数呢?
记上文求出的总重量为 。设第 个人拥有大糖果 个,则他拥有小糖果 个。由于大糖果重量为 ,小糖果重量为 ,可列出等式:
去括号,得:
到这里,我们就得到了 求 个人拥有大糖果数量的公式,直接将每个 代入求值,再相加即可。
1-3.无解判定
如何判断无解?
我们注意到,上文的 必须为整数,因为糖果不可能有小数个,所以第一种无解情况即为: 不是整数。
到这里,有的同学会思考:那为什么不能缩小总重量 ,万一有其他可能的方案呢?
我们感性理解下,如果要缩小 ,那么就需要减少一个大糖果,增加一个小糖果, 将减少 ,而求 的公式中除式正是 。所以,就算减少 ,也不能使 变为整数,同样无解。
还有一种无解情况:,此时说明最大总重量比某个人全拿小糖果的重量还少,无解。
总结一下,无解情况共两种:
- ;
- 。
2.代码
注:代码仅供参考。
CPP#include<bits/stdc++.h>
using namespace std;
const int max_n=2e5+2;
int n,x,y,a[max_n];
int mina=1e9+1; //数组最小值
long long w; //总价值
long long ans; //答案
int cha; //记录 y-x
inline int read(){ //快读
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
int main(){
n=read(),x=read(),y=read();
for(int i=1;i<=n;i++){
a[i]=read();
mina=min(mina,a[i]);
}
w=1ll*mina*y,cha=y-x;
for(int i=1;i<=n;i++){
long long noww=w-1ll*a[i]*x;
if(noww%cha||noww<0){ //除不尽或小于 0,说明无解
puts("-1");
return 0;
}
ans+=(noww/cha);
}
printf("%lld\n",ans);
return 0;
}
3.后记
更多内容,请移步至:
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...