CF 860(Div 2)题解

发布时间 2023-03-28 10:29:48作者: JackieXu

A - Showstopper

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
    int n,a[110],b[110];
    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]);
    bool fl=0;
    for (int i=1;i<n;i++)
    {
        if (a[i]>a[n] || b[i]>b[n]) swap(a[i],b[i]);
        if (a[i]>a[n] || b[i]>b[n])
        {
            fl=1;
             break;
        }
    }
    if (fl==0) printf("Yes\n");
    else printf("No\n");
    }
    return 0;
}

B - Three Sevens

#include <bits/stdc++.h>
#define M 50010
using namespace std;
int t,m,n[M];
bool f[M];
int ans[M];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
    int t;
    t=read();
    vector <int> q[M];
    while (t--)
    {
        int m;
        m=read();
        vector <int> cl;
        for (int i=1;i<=m;i++)
        {
            q[i].clear();
            n[i]=read();
            for (int j=1;j<=n[i];j++)
            {
                int s;
                s=read();
                q[i].emplace_back(s);
            }
        }
        bool fl=1;
        for (int i=m;i>0;i--)
        {
            fl=0;
            for (auto v:q[i])
            {
                if (f[v]==0)
                {
                    fl=1;
                    f[v]=1;
                    cl.emplace_back(v);
                    ans[i]=v;
                }
            }
            if (fl==0) break;
        }
        for (auto v:cl)
            f[v]=0;
        if (fl==0) printf("-1\n");
        else 
        {
            for (int i=1;i<=m;i++)
                printf("%d ",ans[i]);
            printf("\n");
        }

    }
    return 0;
}

值得注意的是最开始我将 \(vector <int> q[M]\) 放在了循环里面,导致 TLE 了三发


C - Candy Store

从上至下贪心地选取。
正确性:因为在同一个价签中多选择一种糖果只会将结果变“劣”,即这个价签只有可能无法接受这种糖果。并且既然第一种糖果就要使用价签,那就可以充分利用这个价签,让这个价签向下继续选取,使得之后的价签需要承载的糖果种类变少,这样结果必然更优。
考虑如何维护这个贪心。

#include <bits/stdc++.h>
#define LL long long
#define N 200010
#define int long long
using namespace std;
LL n,t,a[N],b[N],g,ans;
signed main()
{
    scanf("%lld", &t);
    while (t--)
    {
        scanf("%lld", &n);
        for (int i = 0; i < n; i++)
            scanf("%lld %lld", &a[i], &b[i]);
        g = a[0];
        ans = 1;
        for (int i = 1; i < n; i++)
        {
            LL lcm = b[i] / __gcd(b[i], b[i - 1]) * b[i - 1];
            LL a1 = lcm / b[i - 1];
            LL a2 = lcm / b[i];
            if (g % a1 || a[i] % a2)
            {
                ans += 1;
                g = a[i];
                continue;
            }

            g = __gcd(g / a1, a[i] / a2);
            b[i] *= a2;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

D - Shocking Arrangement

可以构造时始终让前缀和是最大的子串,这样贪心地放就可以了。

#include <bits/stdc++.h>
#define N 300010
#define ll long long
using namespace std;
int t,n,a[N];
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        int l=1,r=n,del=a[n]-a[1];
        ll pre=0;
        bool fl=1;
        vector <int> ans;
        while (l<=r)
        {
            fl=0;
            while (l<=r && pre+a[r]<del)
            {
                pre+=a[r];
                ans.emplace_back(a[r]);
                fl=1;
                r--;
            }
            if (l<=r)
            {
                pre+=a[l];
                if (pre<del)
                {
                    ans.emplace_back(a[l]);
                    fl=1;
                    l++;
                }
            }
            if (fl==0) break;
        }
        if (fl==0) printf("No\n");
        else
        {
            printf("Yes\n");
            for (auto v:ans)
                printf("%d ",v);
            printf("\n");
        }
    }
    return 0;
}