#ABC#
问题陈述
有 NN 人参加一项活动, i /人的交通费用是 Ai 日元。
活动组织者高桥(Takahashi)决定设定交通补贴的最高限额为 x 。 i 的补贴为 min(x,Ai) 日元。这里, x 必须是一个非负整数。
高桥的预算为 M 日元,他希望所有 N 人的交通补贴总额最多为 M 日元,那么补贴限额 x 的最大可能值是多少?如果补贴限额可以无限大,请报告。
限制因素
输入
输出
打印满足预算条件的补贴限额 xx 的最大值(整数)。
如果补贴限额可以无限大,则打印 "infinite"。
思路
二分答案
先定义一个check函数判断但前的是否满足条件
差点对的代码
#include <bits/stdc++.h>
#define ll long long
#define vt vector
#define un unsigned
#define us unordered_set
#define um unordered_map
#define qq queue
#define st set
#define stk stack
#define inl inline
using namespace std;
int n,m,a[200005],b[200005];
inl bool check(int x)
{
int ans=0;
for(int i=1;i<=n;i++)
{
b[i]=min(x,a[i]);
ans+=b[i];
b[i]=0;
}
return ans<=m;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
int sm=0;
for(int i=1;i<=n;i++) cin>>a[i],sm+=a[i];
if(sm<=m)
{
cout<<"infinite";
return 0;
}
int l=0,r=2e5+5,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}
正确的代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
long long M;
cin >> N >> M;
long long A[200005],sm=0;
for (int i=0; i < N; i++) {
cin >> A[i],sm+=A[i];
}
if(sm<=M)
{
cout<<"infinite\n";
return 0;
}
long long l=0, r=0;
for (int i=0; i < N; i++) {
if (A[i] > r) {
r=A[i];
}
}
long long ans=0;
while (l <= r) {
long long mid=l + (r - l) / 2;
long long ts=0;
for (int i=0; i < N; i++) {
ts += (A[i] < mid) ? A[i] : mid;
}
if (ts <= M) {
ans=mid;
l=mid + 1;
} else {
r=mid - 1;
}
}
cout << ans << endl;
return 0;
}
错误原因
没开long long
建议大家还是把判断写在主函数中
我定义成函数就错了写在函数里就没问题