SMU Autumn 2024 Trial 1
A. Load Balancing
很明显题意要的就是让我们把每个数往平均值靠,这样就保证最大值-最小值最小
但是当sum%n !=0的时候就说明无法每个数都等于sum/n,所以处理的方法就是,先计算这些无法等于sum/n的个数cnt,再算出可以到达sum/n的次数n-cnt,然后算出总代价,再用总代价除以2就是答案,因为一个数的增值是由另一个数的减值来的。
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n,sum=0,minn=1e10,maxx=-1;
cin>>n;
vector<int>ve(n);
for(int i=0;i<n;i++){
cin>>ve[i];
sum+=ve[i];
maxx=max(maxx,ve[i]);
minn=min(minn,ve[i]);
}
if(maxx-minn<=1) {
cout<<0<<endl;
return;
}
sort(ve.rbegin(),ve.rend());//按降序排序
int cnt=sum%n,k=sum/n;
//k为向下取整后的均值
//大的向k+1靠,小的向k靠,这样保证总代价最小
int ans=0;
for(int i=0;i<n;i++)
{
if(cnt)
{
cnt--;
ans+=abs(ve[i]-k-1);
}else{
ans+=abs(ve[i]-k);
}
}
cout<<ans/2;
}
signed main()
{
int t=1;
//cin>>t;
while(t--) solve();
}
B. Longest Simple Cycle
一道比较好理解的dp
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;
cin>>n;
int f[n+1]={0};
vector<int>a(n+1),b(n+1),c(n+1);
//c存链的顶点数,b,c为连接位置
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=2;i<=n;i++)
{
if(a[i]==b[i]) f[i]=c[i]+1;
else{
f[i]=max(c[i]+1+f[i-1]-abs(a[i]-b[i]),c[i]+1+abs(a[i]-b[i]));
}
}
cout<<*max_element(f+1,f+n+1)<<endl;
}
signed main() {
int t;
cin >> t;
while (t--) {
solve();
}
}
C. Match Points
二分答案,枚举可以匹配的点对数,但是check里的验证,是这样的,比如 5 7 8 9 10,我枚举的mid=2,那么我要验证的是(5,9)和(7,10)这样才能确保得到的点对数最大
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int>ve;
int n,z;
bool check(int mid)
{
for(int i=1;i<=mid;i++) if(ve[n-mid+i]-ve[i]<z) return 0;
return 1;
}
void solve()
{
cin>>n>>z;
ve.resize(n+1);
for(int i=1;i<=n;i++) cin>>ve[i];
sort(ve.begin()+1,ve.end());
int l=0,r=n>>1,mid=0;//边界r不可以开太大了
int ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
cout<<ans;
}
signed main()
{
int t=1;
//cin>>t;
while(t--) solve();
}
D. Vus the Cossack and a Contest
水题
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n,m,k;
cin>>n>>m>>k;
if(n<=min(m,k)){
cout<<"Yes";
}
else cout<<"No";
}
signed main()
{
int t=1;
//cin>>t;
while(t--) solve();
}
posted on 2024-09-12 14:24 swj2529411658 阅读(6) 评论(0) 编辑 收藏 举报