您的位置:首页 > 运维架构

Uva - 679 - Dropping Balls

2015-06-15 18:36 323 查看




这题真是经历了各种。。。



第一次对题目输入要求没有理解到位,直接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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: