这题真是经历了各种。。。
第一次对题目输入要求没有理解到位,直接RE了,第二次因为方式是模拟所有小球的下落,结果直接超时。
超时代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
using namespace std;
const int maxn = 20;
int s[1 << maxn]; // 2的20次方
int main()
{
int D, I;
int T;
cin >> T;
while (T--) {
cin >> D;
if (D == -1) {
break;
}
cin >> I;
memset(s, 0, sizeof(s));
int k, n = (1 << D) - 1; // n是最大节点编号2的D次方减一
for (int i = 0; i < I; i++) {
k = 1;
while (1) {
s[k] = !s[k];
k = s[k] ? k * 2 : k * 2 + 1;
if (k > n) {
break;
}
}
}
printf("%d\n", k / 2);
}
cout << -1 << endl;
return 0;
}
后来只计算最后一个小球的路径,时间上是没问题了,可是这道题目的输入还是坑了我还几次,输入先要求输入测试次数,最后那个-1以为是最后输出,结果不然,那个-1是要求输入的-1,但是那还怎么按照测试次数进行循环呢,,,最后才发现这个输入测试次数基本就没什么用,最后还是用while(1)做了,里面判断输入是否是-1,是-1了就退出。。真是服了出题者,就是这么任性。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
using namespace std;
int main()
{
int D, I;
int T;
cin >> T;
while (1) {
scanf("%d", &D);
if (D == -1) {
break;
}
scanf("%d", &I);
int k = 1;
for (int i = 0; i < D - 1; i++) {
if (I % 2) {
k = k * 2;
I = (I + 1) / 2;
}
else {
k = k * 2 + 1;
I /= 2;
}
}
printf("%d\n", k);
}
return 0;
}