codeforces 118 div2(a,b,c)

2024-01-01 21:38:33

好像很久没有写整场比赛的题解了哈…补一场
(1900分的d谁会啊…)
这个 a , b a,b a,b挺有意思的, c c c就是一个裸的二分
比赛题目链接

A

题目大意

给定两个数的描述,请你比较两个数的大小关系,每个数的描述为,一个数 x x x,一个数 y y y y y y表示 x x x的后面有 y y y 0 0 0

思路

考察细心和把很大的数(没法存储的)化简小的方法。
先分别读取 x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2
首先我们容易发现,可以让两个数后面的 0 0 0先相互消除一下,也就是 y 1 , y 2 y1,y2 y1,y2分别减去 m i n ( y 1 , y 2 ) min(y1,y2) min(y1,y2),这样其中一个会变成 0 0 0
现在另外一个 y y y可能还是很大,已知 x x x最大为 1 e 6 1e6 1e6,所以当另一个 y > = 7 y>=7 y>=7的时候,就出答案了
如果没有 y > = 7 y>=7 y>=7,就循环乘 10 10 10,最后判断谁大就行了

ACcode

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

void solve()
{
    ll x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    ll p = min(y1, y2);
    y1 -= p;
    y2 -= p;
    if (y1 >= 7) {
        cout << '>' << '\n';
        return;
    }
    else if (y2 >= 7) {
        cout << '<' << '\n';
        return;
    }
    while (y1--)x1 *= 10;
    while (y2--)x2 *= 10;
    if (x1 == x2)cout << '=' << '\n';
    else if (x1 > x2)cout << '>' << '\n';
    else if (x1 < x2)cout << '<' << '\n';
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

B

题目大意

给定含有 n n n个不同的正整数的数组 a a a n n n为偶数,请找到并输出 n / 2 n/2 n/2 x , y x,y x,y,且 x , y x,y x,y存在于数组内, x ! = y x!=y x!=y, x x x% y y y不在数组内,若有多组答案,随便输出一组即可

思路

已知 a a a% y y y < y <y <y,而且题目中说可以同一个数可以多次利用,所以任何数对最小值取余结果都不存在,累计输出就完了

ACcode

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

void solve() {
    int n;cin >> n;
    vector<int>a(n + 3);
    for (int i = 1;i <= n;i++)cin >> a[i];
    sort(a.begin() + 1, a.begin() + 1 + n);
    int ans = 0;
    for (int i = n;i >= 1;i--) {
        cout << a[i] << ' ' << a[1] << '\n';
        ans++;
        if (ans == n / 2)return;
    }
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C

题目大意

给定 n n n次攻击和阈值 k k k,第 i i i次攻击在第 a [ i ] a[i] a[i]时刻开始,每次攻击可持续 x x x秒,且每次攻击可刷新 x x x,问最小的 x x x

思路

裸的二分
c h e c k check check的写法见 c o d e code code

ACcode

    #include<bits/stdc++.h>
     
    using namespace std;
     
    using ll = long long;
     
    const int M = 110;
    ll a[M];
    ll n, b;
    ll j, k, mid;
     
    bool check(ll x) {//二分找单次攻击持续时间
        ll ans = 0;
        for (int i = 1;i < n;i++) {
            if (a[i] + x <= a[i + 1])ans += x;
            else ans += (a[i + 1] - a[i]);
        }
        ans += x;
        return ans >= b;
    }
     
    void solve()
    {
        cin >> n >> b;//攻击次数,目标伤害量(持续伤害的时间
        for (int i = 1;i <= n;i++)cin >> a[i];
        j = 0;k = b;
        while (j < k) {
            mid = j + k >> 1;
            if (check(mid))k = mid;
            else j = mid + 1;
        }
        cout << k << '\n';
    }
     
    int main()
    {
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        int t;cin >> t;
        while (t--) {
            solve();
        }
        return 0;
    }

文章来源:https://blog.csdn.net/weixin_70831807/article/details/135328304
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。