Gym

来源:互联网 发布:apache url重写 编辑:程序博客网 时间:2024/06/03 22:02

给两个盒子 进行如下操作循环
选择一个没有被放入盒子的最小的数 X 放入第一个盒子
将2*X放入第二个盒子。

╮(╯▽╰)╭ 看到2*x这种东西就应该往二进制上想。。然而我没想到。。
首先 奇数肯定都在第一个盒子里, 奇数的二进制的最后一位是1
奇数的两倍肯定在第二个盒子里 这些数的二进制末尾0的的数量是1
所以每一个末尾0的数量为1的偶数都在第二个盒子里
那么每一个末尾0的数量为2的偶数都在第一个盒子里
那么每一个末尾0的数量为3的偶数都在第二个盒子里
。。。。。。。
答案就这么出来了。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>#define MAX 1007#define mem(a,b) memset(a,b,sizeof a);using namespace std;typedef long long LL;const LL INF=(1LL<<60);vector<int> e[MAX];int main(){    int n;    scanf("%d",&n);    while(n--)    {        long long u;        cin>>u;        if(u&1)        {            puts("First Box");        }        else        {            int ans=0;            while(u%2==0)            {                ans++;                u/=2;            }            if(ans&1)                puts("Second Box");            else                puts("First Box");        }    }}
原创粉丝点击