牛客小白赛解题报告

A骰子魔术

这个题考察的是非常基本的数组遍历,只需要依次遍历数组每个元素,看有没有值为x的元素即可

代码如下:

#include<iostream>
using namespace std;
int arr[1001];

int main() {
    int n, x, flag = 0;
    cin >> n >> x;
    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        if (arr[i] == x) flag = 1;
    }
    cout << (flag ? "YES" : "NO") << endl;
    return 0;
}

B最少剩几个

这道题乍一看似乎没什么思路,但是仔细观察会发现,题目中能删除的只有这么几种情况:

1.奇数 X 奇数 == 奇数

2.奇数 + 偶数 == 奇数

那么我们可以遍历数组,把奇数个数和偶数个数统计出来,先把奇数偶数一对一消除,也就是利用性质2,然后如果剩下的是奇数,那么我们就看剩下的奇数个数是不是奇数,如果是奇数证明有一个奇数我们是消不掉的,如果是偶数我们就可以一对一对地全部删掉;反之如果剩下的是偶数,那么我们没办法删除任何数字,也就是剩下的偶数全部不能删除。

细节看代码:

#include<iostream>
using namespace std;

const int MAXN = 1e5 + 5;
int arr[MAXN];

int main() {
    int n;
    int odd = 0, even = 0;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        if (arr[i] % 2 == 0) even += 1;
        else odd += 1;
    }
    int ans = min(even, odd) * 2;
    if (even >= odd) {
        cout << n - ans << endl;
    } else {
        int cnt = odd - even;
        cout << (cnt % 2 == 0 ? 0 : 1) << endl;
    }
    return 0;
}

C两个函数

此题乍一看好像是递归,但是其实会发现它们两个函数并没有任何转移或者递进的关系,所以分类讨论即可,对于x == 1的情况并不复杂,我们着重讨论x > 1的情况:

关于这个求和公式,我们可以一步一步把式子拆开来看:

其中因为数据很大需要取模,我们在过程中注意取模的地方即可,有一点就是取模操作和除法操作没有分配律,所以我们需要特别注意这个地方,不能边除边取模。

具体代码如下:

#include<iostream>
using namespace std;

typedef long long LL;
const LL MOD = 998244353;

#define MUL(VAL) ((VAL) * (VAL) % MOD)
LL f(LL a, LL x) { return a * x % MOD; }
LL getSum(LL a, LL x) { return ((x - 1) * x / 2) % MOD; }

LL solve() {
    LL a, x;
    cin >> a >> x;
    if (x == 1) {
        return f(a, x);
    }
    return MUL(a) * getSum(a, x) % MOD;
}

int main() {
    int q;
    cin >> q;
    while (q--) {
        cout << solve() << endl;
    }
    return 0;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值