这题真是经历了各种。。。
第一次对题目输入要求没有理解到位,直接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 ", 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 ", k); } return 0; }