求助月赛第三题
  • 板块学术版
  • 楼主Acfboy
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/8/11 17:29
  • 上次更新2023/11/6 20:37:47
查看原帖
求助月赛第三题
40318
Acfboy楼主2020/8/11 17:29

今天题解开放,大家可以帮我看看了吧。

我和题解的想法几乎一样但我写得好看了很多,可是只有四十分。

  • LG_0/1 统计kk该位上取0/1,异或结果为1个数

看着我简洁美观码风优良的代码就帮我调调吧

#include <cstdio>
#include <iostream>
#define N 100005
using namespace std;
long long a[N], maxx, m, ans, n, q, LG_0[55], LG_1[55];
long long Doit(int d){
    long long an = 0, ans = 0;
    bool flag = 0;
    for(int i = d; i >= 0; i--){
        long long now = (long long) 1 << i;
        if(an + now * LG_1[i] <= m){
            an += now * LG_1[i];
            ans += now;
        }
        else if(an + now * LG_0[i] <= m)
            an += now * LG_0[i];
        else return -1;
    }
    return ans;
}
int main(){
    scanf("%lld", &n);
    int maxx = 0;
    for(int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    for(int i = 0; i <= 51; i++)
        for(int j = 1; j <= n; j++){
            LG_0[i] += (a[j] >> i) & 1;
            LG_1[i] += 1 - ((a[j] >> i) & 1);
        }
    scanf("%lld", &q);
    for(int i = 1; i <= q; i++){
        scanf("%lld", &m);
        ans = Doit(51);
        printf("%lld\n", ans);
    }
    return 0;
}
2020/8/11 17:29
加载中...