AcWing第37场周赛题解

第37场周赛活动链接

problem.A AcWing4296 合适数对

由于题目限制x,y都是非负整数,所以暴力即可,无需扩展欧几里得。

代码

#include <iostream>

using namespace std;

int main()
{
    int n,a,b;
    cin>>n>>a>>b;
    
    for(int i=0;i*a<=n;i++)
        if((n-i*a)%b==0)
        {
            cout<<"YES"<<endl;
            cout<<i<<' '<<(n-i*a)/b<<endl;
            return 0;
        }
    
    cout<<"NO"<<endl;
    
    return 0;
}

problem.B AcWing4297 截断数组

前后缀数组与处理好之后,暴力枚举前缀和,然后用二分找到是否存在合法的后缀和,不断取max得到答案

代码

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 2e5 + 10;

int n;
LL a[N],s[N],rev[N];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }
    
    for(int i=n;i>=1;i--)
        rev[i]=rev[i+1]+a[i];
    
    LL maxv=0;
    for(int i=1;i<=n;i++)
    {
        int l=i+1,r=n;
        while(l<r)
        {
            int mid = l + r >> 1;
            if (rev[mid]<=s[i]) r = mid;
            else l = mid + 1;
        }
        if(rev[l]==s[i])
            maxv=max(maxv,s[i]);
    }
    cout<<maxv<<endl;
    
    return 0;
}

problem.C AcWing4298 搭档

匈牙利算法找二分图最大匹配即可,至于题目“当一对男女的魅力值相差不超过1时,他们才会愿意组成搭档。”作为建图规则,暴力枚举数据建图。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 105,M = 10010;

int n,m;
int a[N],b[N];
int h[N], e[M], ne[M], idx;
int match[N];
bool st[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>m;
    for(int i=1;i<=m;i++) cin>>b[i];
    
    memset(h, -1, sizeof h);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(abs(a[i]-b[j])<=1)
                add(i,j);
    
    int res = 0;
    for (int i = 1; i <= n; i ++ )
    {
        memset(st, false, sizeof st);
        if (find(i)) res ++ ;
    }
    
    cout<<res<<endl;
    
    return 0;
}
posted @ 2022-02-06 12:58  泝涉江潭  阅读(20)  评论(0)    收藏  举报