牛客小白月赛81(A~D)

文章讲述了四个编程竞赛题目,涉及排序、双指针遍历、大数运算和概率计算的解题思路,以及对应的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A 小辰打比赛
解题思路

白给的题,输入后升序排序再遍历,如果a[i]<x就把他们累加,否则退出循环即可。

AC代码
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,x,a[1000];
    cin>>n>>x;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    int sum = 0;
    for(int i=0;i<n;i++)
    {
        if(a[i]<x) sum += a[i];
        else break;
    }
    cout<<sum;
    return 0;
}
B 小辰的圣剑
解题思路

直接两层循环(双指针也可以)遍历,我们统计枚举的每一段的声望和、消耗的耐久的和如果分别超出u和m,break就好。每次枚举都要更新一下区间长度。

AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5500;
typedef long long LL;
LL s1[N],s2[N],a[N],b[N];
int main()
{
    LL n,m,u;
    cin>>n>>m>>u;
    
    int maxv = 0;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++)
    {
        LL s1=0,s2=0;
        for(int j=i;j<=n;j++)
        {
            s1 += a[j], s2 +=b[j];
            if(s1 > m  ) break;
            if(s2 > u  ) break;
            maxv = max(maxv,j-i+1);
        }
    }

    cout<<maxv<<endl;
    return 0;
}
C 陶陶学算术
解题思路

这么大的数直接乘除肯定会越界,我们可以把所有的除都转换为乘法,把答案ans1和自己算的数ans2的乘法都乘到自己身上,除的部分都变成乘积乘到对方身上,请看下图。我们比较ans1是否等于ans2直接比较A*DB*C即可。

微信图片_20231118163951.jpg

AC代码
#include<bits/stdc++.h>

using namespace std;
const int N = 1e9+9;
typedef int long long;
int n;

signed main()
{

    cin>>n;
    int op,x;
    long long ans1 = 1,ans2 = 1;
    while(n--)
    {
        cin>>op>>x;
        if(op==1) ans1 = ans1 * x % N;
        else ans2 = ans2 * x % N;
    }
    cin>>n;
    while(n--)
    {
        cin>>op>>x;
        if(op==1) ans2 = ans2 * x % N;
        else ans1 = ans1 * x % N;
    }
    if(ans1==ans2) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}
D 小辰的借钱计划
解题思路

首先$期望=V_i * P_i $

不交换的话,期望就为1*a=a,交换的话,那就是每个符合条件的数乘以他们出现的次数求和
符合条件a%i==0 || i%a==0。最后比较两个的期望,还可以转化一下,把交换的概率放到a的一端,即a*cnt

AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int m,a;
    while(t--)
    {
        cin>>m>>a;
        int sum = 0, cnt = 0;
        for(int i=1;i<=m-a;i++)
        {
            if(a%i==0 || i%a==0)
            {
                cnt++;
                sum += i;
            }
        }
        if(a*cnt<sum) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值