2024 暑假友谊赛 1

1.A-😜

原题链接:

https://vjudge.net/contest/638765#problem/A

 看一个烤箱时间为j的情况是否存在,采用dp的方式记录,最后将j和sum-j比较取最大,再取最小

查看代码
 #include<bits/stdc++.h>
#define int long long
using namespace std;

int sum1,sum2,mi,n;
signed main()
{
    cin>>n;
    int sum=0;
    int a[n];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    vector<vector<bool>> dp(n + 1, vector<bool>(sum + 1, false));
    dp[0][0]=true;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=sum;j++)
        {
            if(dp[i][j])
            {
                dp[i+1][j]=true;//将所有可能的情况都标记为true
                dp[i+1][j+a[i]]=true;
            }
        }
    }
    int ans=sum;
    for(int i=0;i<=sum;i++)
    {
        if(dp[n][i])
        {
            ans=min(ans,max(i,sum-i));
        }
    }
    cout<<ans;
    return 0;
}

 2.B - 😭

原题链接:

https://vjudge.net/contest/638765#problem/B

从大到小排序后的a在从小到大排序后的b中找y值最小且满足情况的值,并标记不可再次访问,最后记录标记的数量

查看代码
 #include<bits/stdc++.h>
#define int long long
#define PII pair <int,int>
using namespace std;
int n;
signed main()
{
    cin>>n;
    vector<PII>a(n),b(n);
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        a[i].first=x;
        a[i].second=y;
       // cout<<a[i].first<<" "<<a[i].second<<endl;
    }
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        b[i].first=x;
        b[i].second=y;
        //cout<<b[i].first<<" "<<b[i].second<<endl;
    }
    sort(a.begin(),a.end(),greater<>());
    sort(b.begin(),b.end());
    vector<int>sign(n);
    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=0;j<n;j++)
        {
            if(sign[j])continue;
            if(b[j].first <= a[i].first or b[j].second <= a[i].second)continue;
            if(t==-1)
            {
                t=j;
            }
            if(t!=-1&&b[j].second<b[t].second)t=j;
        }
        if(t!=-1) {
            sign[t] = 1;
        }
    }
    cout << accumulate(sign.begin(), sign.end(), 0ll);
    return 0;
}

3.D-😓

原题链接:

https://vjudge.net/contest/638765#problem/D

暴力循环即可,但要注意不要一开始就用k限制,因为d的size不一定比k大😭

查看代码
 #include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000000],b[1000000],c[1000000];
signed main() {
    int x,y,z,k;
    cin>>x>>y>>z>>k;
    for(int i=1;i<=x;i++)cin>>a[i];
    for(int i=1;i<=y;i++)cin>>b[i];
    for(int i=1;i<=z;i++)cin>>c[i];
    vector<int>d,e;
    for(int i=1;i<=x;i++)
    {
        for(int j=1;j<=y;j++)
        {
            d.push_back(a[i]+b[j]);
        }
    }
    sort(d.begin(),d.end(),greater<>());
    d.resize(min((int) d.size(),k));
    for(int i=0;i<d.size();i++)
    {
        for(int j=1;j<=z;j++)
        {
            e.push_back(d[i]+c[j]);
        }
    }
    sort(e.begin(),e.end(),greater<>());
    e.resize(min((int) e.size(),k));
    for(int i=0;i<e.size();i++)
        cout<<e[i]<<endl;
    return 0;
}

 

posted @ 2024-07-13 15:40  伊芙加登  阅读(6)  评论(0编辑  收藏  举报