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;
}