站外题求助
  • 板块题目总版
  • 楼主jqQt0220
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/11/23 19:23
  • 上次更新2023/11/23 21:31:35
查看原帖
站外题求助
678175
jqQt0220楼主2023/11/23 19:23

题目描述

最近,蒟蒻小明的班上准备拍一次特殊的集体照,因为队形要求是要班上的所有 3232 名同学全部站成一排。而好学的小明发现,在这种情况下,如果将男女生分别看成 11 和 00,照相的队形就能组成一个 3232 位长的二进制数,而二进制又能转化成十进制,因此一个不同的队形就对应了一个不同的数字。

小明想考一考他的同桌,就想出了一个问题:给定原始队形 xx,问如何重新排列队伍,才能得到第一个在数值上比原始队形大的数 yy 呢。但其实身为蒟蒻的小明自己也不知道答案,所以就把计算答案这个任务委托给了聪明的你,请你写一个程序帮帮孩子。

代码:(有些奇奇怪怪的东西)

#include<bits/stdc++.h>
using namespace std;
// #define fileio
#define IOS
void ___()
{
#ifdef fileio
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
#ifdef IOS
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define endl '\n'
#endif
}
#define ll long long
typedef unsigned int uint;
uint solve(uint x)
{
    uint t=x,p=0,y=0;
    bool f=0;
    while(t)
    {
        if((t&1)==0)
        {
            if(f)
                break;
        }
        else
            f=1;
        y&=((t&1)<<p);
        p++;
        t>>=1;
    }
    return (t<<p)&(y<<1);
}
int main()
{
    ___();
    while(1)
    {
        uint x;
        cin>>x;
        if(!x)
            break;
        cout<<solve(x)<<endl;
    }
    return 0;
}
2023/11/23 19:23
加载中...