intmain(){ int t; std::cin >> t; while (t--) { int cnt, res = 0, last = -1, next_try = 0; while (true) { std::cin >> cnt; if (cnt == 0) { break; } next_try = 1; if (last != -1) { next_try += (1 << (cnt - last + 1)) - 1; last -= 1; } else { last = cnt; } if (last == 0) { res += next_try - 1; break; } std::cout << "- " << next_try << std::endl; res += next_try; } std::cout << "! " << res << std::endl; } return0; }
绷语言
cnt 表示上次请求得到的二进制表示中 1 的数量
acc 表示目前已累积的结果大小
ptr 表示可以减掉第几位(从 0 开始,如果 ptr == cnt 说明会减到 -1,故停止)
1 2 3 4 5 6 7 8 9 10 11
main : Void main = let t = input run for t let (cnt, acc, ptr) = (input, 0, 0) rec if ptr == cnt then nope else let value = pow 2 ptr run print `- {value}` let new_cnt = input (new_cnt, acc + value, ptr + new_cnt - cnt + 1) print `! {acc + pow 2 ptr - 1}`
使用绷语言思路重写 C++ 程序
C++ 中没有绷语言对变量可变性的限制,变量在一个循环内是错开修改的,而绷语言强制同步修改,这会降低认知压力。然而,在算法竞赛中,我们往往难以使用绷语言。若能使用绷语言思路写 C++ 程序,会产生怎样的效果呢?