ABC365C题题解

#ABC#

问题陈述

有 NN 人参加一项活动, i /人的交通费用是 Ai 日元。

活动组织者高桥(Takahashi)决定设定交通补贴的最高限额为 x 。 i 的补贴为 min⁡(x,Ai) 日元。这里, x 必须是一个非负整数。

高桥的预算为 M 日元,他希望所有 N 人的交通补贴总额最多为 M 日元,那么补贴限额 x 的最大可能值是多少?如果补贴限额可以无限大,请报告。

 限制因素

1\leq N\leq 2*10^{5}

1\leq M\leq 2*10^{14}

1\leqA_{i}

输入

N M

A_{1} A_{2} ...... A_{i}

输出

打印满足预算条件的补贴限额 xx 的最大值(整数)。

如果补贴限额可以无限大,则打印 "infinite"。

思路

二分答案

先定义一个check函数判断但前的x是否满足条件

差点对的代码

#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

建议大家还是把判断写在主函数中

我定义成函数就错了写在函数里就没问题

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值