WA求调
查看原帖
WA求调
656774
ZhangWeiYue0203楼主2025/4/26 20:01

提交WA,请dalao指导一下哪里有问题

思路

若二进制下‘1’的数量达标,则输出‘0’; 若需要的‘1’的数量大于有效数字位数则全部填充为‘1’并作差; 否则从低位向高位0改1(1的数量少)或1改0(1的数量多)。


提交记录


代码

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll a[65],b[65],c[65];

ll counts(ll x){
    ll res=0,tmpd=x;
    while (tmpd)
    {
        res += tmpd % 2;
        tmpd /= 2;
    }
    return res;
}

int main(){
    ll T;
    scanf("%lld",&T);
    while (T--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));

        ll x,k;
        scanf("%lld %lld",&x,&k);
        ll cnt1a=counts(x);
        if(cnt1a == k){
            printf("0\n");
            continue;
        }

        ll pt=0,tmpx1=x;
        while(tmpx1){
            a[pt++] = tmpx1 % 2;
            tmpx1 /= 2;
        }
        if(pt <= k){
            ll ans = (1 << k) - 1 - x;
            printf("%lld\n",ans);
            continue;
        }

        if(cnt1a > k){
            ll tmp1a=cnt1a;
            for (ll i = 0; i < pt; i++)
            {
                if(tmp1a == k){
                    break;
                }
                if(a[i] == 1){
                    a[i]=0;
                    tmp1a--;
                }
            }
        }else if(cnt1a < k){
            ll tmp1a=cnt1a;
            for (ll i = 0; i < pt; i++)
            {
                if(tmp1a == k){
                    break;
                }
                if(a[i] == 0){
                    a[i]=1;
                    tmp1a++;
                }
            }
        }
        ll ans=0;
        for (ll i = 0; i < pt; i++)
        {
            if(i == 0){
                ans += a[i] * 1;
            }
            ans += a[i] * pow(2,i);
        }
        printf("%lld\n",abs(ans-x));
    }
    return 0;
}
2025/4/26 20:01
加载中...