codeforces round#756 div3

21 篇文章 0 订阅
19 篇文章 0 订阅

题目链接

补题挖坑

A

找偶数,四种情况分类

  • 没偶数
  • 正好最后一位是
  • 正好左边第一位是
  • 中间有偶数
#include <iostream>
using namespace std;
typedef long long ll;
ll n, a, b;
int main()
{
    cin >> n;
    while (n--)
    {
        string s;
        cin >> s;
        int flag = 0;
        for (int i = 0; i < s.size();++i)
            if((s[i]-'0')%2==0)
            {
                flag = 1;
                break;
            }
        if((s[s.size()-1]-'0')%2==0)
            cout << 0 << endl;
        else if((s[0]-'0')%2==0)
            cout << 1 << endl;
        else if(flag)
            cout << 2 << endl;
        else
            cout << -1 << endl;
    }
    return 0;
}
B

优先找13的,找差值 ∣ a − b ∣ / 2 |a-b|/2 ab/2就是最多容纳的13类型,然后考虑 m i n ( a , b ) min(a,b) min(a,b)是否大于,大于的话继续22,不的话就min咯

#include <iostream>
using namespace std;
typedef long long ll;
ll n, a, b;
int main()
{
    cin >> n;
    while (n--)
    {
        cin >> a >> b;
        if (a > b)
            swap(a, b);

        ll ans = (b - a) / 2;
        if (a > ans)
            cout << (a - ans) / 2 + ans << endl;
        else
            cout << a << endl;
    }
    return 0;
}
C

这个题感觉和以前一个操作很像,记得变换都是循环的,最不可能的情况就是大数在里面包着,然后合理情况输出就是找规律

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n, a, t;
int main()
{
    cin >> n;
    while (n--)
    {
        cin >> t;
        vector<int> b(t);
        for (auto &i : b)
            cin >> i;
        
        if(b[0]==t||b[b.size()-1]==t)
        {
            for (int i = (b.size() - 1) / 2; i >= 0;i--)
                cout << b[i] << ' ';
            for (int i = b.size() - 1; i > (b.size() - 1) / 2;i--)
                cout << b[i] << ' ';
            cout << endl;
        }
        else
        {
            cout << -1 << endl;
        }
        
    }
    return 0;
}
D

挺有意思的题目,记录一个前缀和,路径大小刚刚比要求限制大1就行
我的做法就是:
s s s数组记录以第 i i i为节点的时候所需要的最小长度,题目例子里的到达5最小长度就是比2多1,结果就是3,之后减去父节点的 s s s数组值,sum就是保留的上一阶段的长度,比他大1就完了,但是想了半天人就傻了

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
ll n, a, t;
int main()
{
    cin >> n;
    while (n--)
    {
        cin >> t;
        vector<ll> bb(t + 1), pp(t + 1), ans(t + 1, -1);
        for (int i = 1; i <= t; ++i)
            scanf("%d", &bb[i]);
        for (int i = 1; i <= t; ++i)
            scanf("%d", &pp[i]);

        bool flag = true;
        ans[pp[1]] = 0;
        ll sum = 0;
        vector<ll> s(t + 1);
        for (int i = 1; i <= t; ++i)
        {
            if (ans[bb[pp[i]]] < 0)
            {
                flag = 0;
                break;
            }
            if (bb[pp[i]] == pp[i])
                continue;
            s[pp[i]] = sum + 1;
            ans[pp[i]] = s[pp[i]] - s[bb[pp[i]]];
            sum = s[pp[i]];
        }
        if (flag)
        {
            for (int i = 1; i <= t; ++i)
                cout << ans[i] << ' ';
            cout << endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }
    return 0;
}

F

民间代码,我先插眼

#include <iostream>
using namespace std;
typedef long long ll;
ll n, a[1000000], t;
int main()
{
    cin >> t;
    while (t--)
    {
        long long n, s;
        cin >> n >> s;
        for (int i = 1; i <= n; ++i)
            cin >> a[i];
        long long sum = 0, l = 1, r = 1;
        long long al = 0, ar = 0, len = -1;
        while (l <= r && r <= n)
        {
            sum += a[r++];
            if (sum + s >= 0)
            {
                if (r - l > len)
                {
                    len = r - l;
                    al = l;
                    ar = r;
                }
            }
            while (sum + s < 0)
            {
                sum -= a[l++];
            }
        }
        if (len != -1)
            cout << al << " " << ar - 1 << endl;
        else
        {
            cout << -1 << endl;
        }
    }
    return 0;
}

有能力再继续补
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学小牛马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值