1s 512MB
题目描述
这是一道通信题。
沙漠星球的皇帝(后面简称沙皇)热爱兵兵球,兵兵球具体就是让两个神金兵(沙皇御林军)用球传递信息,这次沙皇喊了神金兵中的两个佼佼者,阿里斯和保部,让他们只用黑球和白球来交流
具体的,沙皇给阿里斯一个数,阿里斯可以把任意多的黑白球按自己的想法有顺序地排成一个序列交给保部,保部则要通过这个序列确定沙皇给的数,并且序列的长度要小于等于沙皇给定的限制
这当然难不到他们,但是沙皇决定让他的爱臣古瑞德加点难度,在阿里斯排好序列后,在保部拿到序列之前,古瑞德可以挑选一个位置,并可以选择是否把这个位置的球反色
现在阿里斯和保部不会了,所以他们来请教你,神金兵大统领,你能帮帮他们吗?
编写要求
本题需要你实现 Alice.cpp
和 Baobu.cpp
在 Alice.cpp
中,你需要在文件的最开头加上 #include "Alice.h"
,并将变量和函数定义在 namespace {}
中,在 namespace {}
外,你只需要实现 vector<int> Get_Array(unsigned long long N);
, N
是沙皇给阿里斯的数,你需要返回一个每位都为 $0$ 或 $1$ ,表示这一位是黑球还是白球,且长度不应超过 $200$ 的序列
在 Baobu.cpp
中,你需要在文件的最开头加上 #include "Baobu.h"
,并将变量和函数定义在 namespace {}
中,在 namespace {}
外,你只需要实现 unsigned long long Get_Num(vector<int> Array);
, Array
是经过了古瑞德操作的序列,保证每位都为 $0$ 或 $1$ ,表示这一位是黑球还是白球,你需要返回一个数,表示保部确定的数
如果有一次阿里斯给出了非法序列或是保部猜错了,你将会获得 $0$ 分的好成绩,否则如果你用到的最大长度为 $len$ ,那么你的得分为 $\min(1,(\frac{98}{len}-0.4)^{0.7}) \times 100$
保证 Get_Array
调用次数不超过 $20$ 次, Get_Num
调用次数不超过 $5000$ 次,共有 $10$ 个测试点,得分是这 $10$ 个点得分的最小值
本地编译与运行
本题下发了于本地使用的 grader.cpp
、 Alice.h
、 Alice_sample.cpp
、 Baobu.h
、 Baobu_sample.cpp
,选手可以使用 g++ -o grader grader.cpp Alice.cpp Baobu.cpp
编译出可执行文件 grader
然后即可运行
下发的 grader.cpp
输入格式为第一行一个数 $T$ 表示组数,接着 $T$ 行每行一个数 $N$ ,表示沙皇给的数
注意如果选手使用的是 Windows 系统,推荐使用题目页面的自定义测试界面运行代码
数据范围与约束
对于 $100 \%$ 的数据,保证 $1 \le T \le 20,0 \le N < 2^{63}$