Uva - 679 - Dropping Balls




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


第一次对题目输入要求没有理解到位,直接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;
}



posted @ 2015-06-15 18:36  Say舞步  阅读(526)  评论(0编辑  收藏  举报