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 调出来再说

posted @ 2024-12-11 23:15  Weslie_qwq  阅读(34)  评论(0)    收藏  举报