Codeforces Round #797 (Div. 3)(A-G)题解

A. Print a Pedestal (Codeforces logo?)

题意

水题,一个数,让你分成三个数a,b,c,关系大小为b>a>c,要严格大于,而且要使b的取值尽可能地大
题解
分三种情况讨论即可

#include <bits/stdc++.h>
#define ll long long
#define gcd __gcd
#define endl '\n'
#define mem(x, y) memset(x, y, sizeof(x))
#define inf 0x3f3f3f
#define ninf 0xc0c0c0c0
#define se second
#define fr first
using namespace std;
typedef pair<int, int> PII;
const int N = 200010;
int a[N];
void solve()
{
    int n;
    scanf("%d", &n);
    if (n == 7)
    {
        printf("2 4 1\n");
        return;
    }
    if (n % 3 == 0)
    {
        printf("%d %d %d\n", n / 3, n / 3 + 1, n / 3 - 1);
    }
    else if (n % 3 == 1)
    {
        printf("%d %d %d\n", n / 3 + 1, n / 3 + 2, n / 3 - 2);
    }
    else
    {
        printf("%d %d %d\n", n / 3 + 1, n / 3 + 2, n / 3 - 1);
    }
}
signed main()
{
    int t;
    scanf("%d", &t);
    while (t--)
        solve();
}

B. Array Decrements

题意
给你a,b两个序列,以及一种操作:
选中a序列中的一个数,让a序列中除了这个数以外的数全部减一,问最终能否能变成b序列
题解
维护除bi=0以外,所有ai与bi的差值,如果bi>ai一定不可以,差值不相等也不可以,同时维护bi为0的ai的最大值,如果出现过bi等于0,且ai的最大值大于其他bi不等于其他差值,也是不可以,除此以外都是可以

#include <bits/stdc++.h>
#define ll long long
#define gcd __gcd
#define endl '\n'
#define mem(x, y) memset(x, y, sizeof(x))
#define inf 0x3f3f3f
#define ninf 0xc0c0c0c0
#define se second
#define fr first
using namespace std;
typedef pair<int, int> PII;
const int N = 200010;
int a[N];
int b[N];
struct node
{
    int x, id;
} sum[N];
bool cmp(node a, node b)
{
    return a.x < b.x;
}
void solve()
{
    int n;
    int x, y = -100, flag = 0, ff = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &b[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        if (a[i] < b[i])
        {
            flag = 1;
            break;
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (b[i] != 0)
        {
            if (ff == 0)
            {
                x = a[i] - b[i], ff = 1;
            }
            else
            {
                if (x != a[i] - b[i])
                {
                    flag = 1;
                    break;
                }
            }
        }
        else if (b[i] == 0)
        {
            y = max(y, a[i]);
        }
    }
    if (y > x && ff == 1)
    {
        flag = 1;
    }
    if (flag)
        printf("NO\n");
    else
        printf("YES\n");
}

signed main()
{
    int t;
    scanf("%d", &t);
    while (t--)
        solve();
}

C. Restoring the Duration of Tasks

题意
给两个序列,一个代表一个事件的开始时间,一个代表一个事件的结束时间,让你求做每个占用做的时间,必须一个事件做完,才能做下一个事件
题解
用每个事件的开始时间和上一个事件结束的时间去比较,如果这个事件的开始时间比上一个事件的结束时间早的话,用这个事件结束的时间减去上一个事件的结束时间即可

#include <bits/stdc++.h>
#define int long long
#define gcd __gcd
#define endl '\n'
#define mem(x, y) memset(x, y, sizeof(x))
#define inf 0x3f3f3f
#define ninf 0xc0c0c0c0
#define se second
#define fr first
using namespace std;
typedef pair<int, int> PII;
const int N = 200010;
int a[N];
void solve()
{
    int a, b, c;
    scanf("%lld%lld%lld", &a, &b, &c);
    for (int i = 1; i * a <= c; i++)
    {
        int x = c - i * a;
        if (x < 0)
        {
            break;
        }
        if (x % b == 0)
        {
            printf("%lld %lld\n", i, x / b);
            return;
        }
    }
    printf("-1\n");
}
signed main()
{
    solve();
}

剩下的明天补上~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值