SH ccf 202412 月赛做题记录
丙组
AB:没看。
C:直接两个序列都从大到小排序,贪心即可。
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long a[N],b[N],ans=0;
int n,m,h;
bool cmp(int _,int __){
return _>__;
}
void solve(){
scanf("%d%d%d",&n,&m,&h);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=m;i++)scanf("%lld",&b[i]);
sort(a+1,a+n+1,cmp);
ans=0;
sort(b+1,b+m+1,cmp);
for(int i=1;i<=min(n,m);i++){
ans=ans+min(h*b[i],a[i]);
}
printf("%lld\n",ans);
}
int main(){
int T;scanf("%d",&T);
while(T--)solve();
}
D:按位拆。
选择的几何应该满足以下条件:
- 在应该有 \(1\) 的位置上全都是 \(1\)。
- 在应该有 \(0\) 的位置上至少有一个 \(0\)。
判断即可。
#include<bits/stdc++.h>
using namespace std;
const int N=100005,M=35;
int n,t[N],x,a[N][M];
vector<int>g;
void solve(){
g.clear();
scanf("%d%d",&n,&x);
for(int i=0;i<30;i++)t[i]=(x>>i)&1;
for(int i=1;i<=n;i++){
scanf("%d",&x);
bool f=1;
for(int j=0;j<30;j++){
a[i][j]=(x>>j)&1;
if(t[j]==1&&a[i][j]!=1)f=0;
}
if(f)g.push_back(i);
}
if(g.size()==0){
printf("No\n");
return;
}
for(int i=0;i<30;i++){
if(t[i]==1)continue;
bool f=0;
for(auto j:g){
if(a[j][i]==0){
f=1;
break;
}
}
if(f==0){
printf("No\n");
return;
}
}
printf("Yes\n");
return;
}
int main(){
int T;
scanf("%d",&T);
while(T--)solve();
}
乙组
我把 T1 调出来再说

浙公网安备 33010602011771号