您的位置:首页 > 移动开发 > Objective-C

POJ 1702 怎么就TLE了 还是纪念一下 第一个独立完成的递归

2009-09-03 22:27 615 查看
一个case最多递归20次 就TLE了 递归的代价真的那么吓人?

换成非递归做?

暂时没这个毅力了。。。

经过分析问题终于独立想出了这个递归的解法 表扬一下自己

纪念一下 尽管是个TLE

Eva's Balance

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 2616 Accepted: 1278
Description
Eva has a balance with 20 poises. The weights of the poises are 1, 3, 9, 27,...,3^19. Eva asserts that she has a way to measure any object whose weight is an integer from 1 to (3^20-1)/2. Assuming that Eva has placed an object with the weight in this range on the left tray of the balance, your task is to place the proper poises on the proper trays so as to weigh the object out.
Input
The first line is an integer T (1 <= T <= 20), which shows the number of the test cases. Each of the following T lines contains an integer W (1 <= W <= (3^20-1)/2), expressing the weight of an object.
Output
For each test case print a line, showing the weights of the poises on the left tray and the right tray. Use a space to separate the left tray and the right tray. The poises on the same tray are arranged in the increasing order, and a comma separates every two of them. If there is no poise on the tray, output "empty".
Sample Input
3
9
5
20

Sample Output
empty 9
1,3 9
1,9 3,27

Source
POJ Monthly--2004.07.18
My TLE Code:
#include <iostream>

using namespace std;

int poises[20]={0};//-1表示放左侧,0表示不放,1表示放右侧
int cube_of_3[21];
int l[20]={0},r[20]={0};

void weight_it(int wei,int side)
{
int base = 0;
for (;base <= 20;base++)
{
if ((cube_of_3[base]-1)/2<wei&&wei<=(cube_of_3[base+1]-1)/2)
{
poises[base]=side;
break;
}
}
if (wei-cube_of_3[base]==0)
return;
else if (wei-cube_of_3[base]>0)
weight_it(wei-cube_of_3[base],side);
else
weight_it(-(wei-cube_of_3[base]),-side);
}

int main()
{
int count;
cin>>count;
cube_of_3[0] = 1;
for (int i = 1;i < 20;i++)
cube_of_3[i] = 3*cube_of_3[i-1];
while (count--)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(poises,0,sizeof(poises));
int weight;
cin>>weight;
weight_it(weight,1);
int j = 0,k = 0;
for (int i = 0;i < 20;i++)
{
if (poises[i]==-1)
{
l[j++]=cube_of_3[i];
}
else if(poises[i]==1)
{
r[k++]=cube_of_3[i];
}
}
if(j==0)
cout<<"empty";
for (int i = 0;i < j;i++)
{
cout<<l[i];
if(i!=j-1)
cout<<",";
}
cout<<" ";
if(k==0)
cout<<"empty";
for (int i = 0;i < k;i++)
{
cout<<r[i];
if(i!=k-1)
cout<<",";
}
cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息