回 帖 发 新 帖 刷新版面

主题:跪求高手 修改一个算法

The discrete wavelet transform is a popular tool for signal compression. In this problem, your job is to write a program to decompress a one-dimensional signal (a list of integers) that has been compressed by a simple wavelet transform.

To understand how this simple wavelet transform works, suppose that we have a list of an even number of integers. We compute the sum and difference of each pair of consecutive samples, resulting in two lists of sums and differences each having half the original length. Formally, if the original samples are a(1),..., a(n) the i-th sum s(i) and difference d(i) are computed as:

for i = 1,...,n/2:
s(i) = a(2*i-1) + a(2*i)
d(i) = a(2*i-1) - a(2*i)
This is then rearranged to give the transformed signal by first listing the sums and then the differences. For example, if the input signal is:
5, 2, 3, 2, 5, 7, 9, 6
Then the sum and difference signals are:
s(i) = 7, 5, 12, 15
d(i) = 3, 1, -2, 3
Thus, the transformed signal is:
7, 5, 12, 15, 3, 1, -2, 3
The same process is applied recursively to the first half of the transformed signal, treating s(i) as the input signal, until the length of the input signal is 1. In the example above, the final transformed signal is:
39, -15, 2, -3, 3, 1, -2, 3
It is assumed that the length of the original input is a power of 2, and the input signal consists of integers between 0 and 255 (inclusive) only.

Input

The input consists of a number of cases. Each case is specified on a line, starting with an integer N (1 <= N <= 256) indicating the number of samples. The next N integers are the transformed samples. The end of input is indicated by a case in which N = 0.

Output

For each test case, output the original samples on a single line, separated by a single space.

Sample Input


8 39 -15 2 -3 3 1 -2 3
4 10 -4 -1 -1
0

Sample Output


5 2 3 2 5 7 9 6
1 2 3 4

题目就是上面那个
我写了两个都超时了!如下,跪求高手改一下  time 2s
#include<iostream>
using namespace std;
int main()
{
    int N,list[2][256],f0=0,f1=1,tmp;
    while(cin>>N,N!=0){
    for(int i=0;i<N;i++){
        cin>>list[f0][i];
        list[f1][i]=list[f0][i];
    }
    for(int n=1;n<N;n*=2){
        for(int k=0;k<n;k++){
            list[f0][k*2]=(list[f1][k]+list[f1][n+k])/2;
            //list[f0][k*2+1]=(list[f1][k]-list[f1][n+k])/2;
            list[f0][k*2+1]=list[f0][k*2]-list[f1][n+k];

        }
        tmp=f0;
        f0=f1;
        f1=tmp;
    }
    for(int t=0;t<N;t++)
        cout<<list[f1][t]<<" ";
    cout<<endl;
    }
}

#include<iostream>
using namespace std;
int main()
{
    int N,list[257];
    int tmpl,tmpr;
    while(cin>>N,N!=0){
    for(int i=1;i<=N;i++)
        cin>>list[i];
    tmpl=(list[1]+list[2])/2;
    tmpr=(list[1]-list[2])/2;
    for(int i=3;i<N/2;i+=2) tmpl=(tmpl+list[i])/2;
    for(int i=4;i<=N/2;i+=2) tmpr=(tmpr+list[i])/2;
    cout<<(tmpl+list[N/2+1])/2<<" ";
    cout<<(tmpl-list[N/2+1])/2<<" ";
    int f=1,t=2;
    for(int j=N/2-1;j>2;j-=2,f*=2,t++){
        tmpl-=list[j]/f;
        cout<<(tmpl+list[N/2+t])/2<<" ";
        cout<<(tmpl-list[N/2+t])/2<<" ";
    }
    cout<<(tmpr+list[N/2+t])/2<<" ";
    cout<<(tmpr-list[N/2+t])/2<<" ";
    f=1;
    for(int j=N/2;j>3;j-=2,f*=2,t++){
        tmpr-=list[j]/f;
        cout<<(tmpr+list[N/2+t])/2<<" ";
        cout<<(tmpr-list[N/2+t])/2<<" ";
    }
    cout<<endl;
    }
}

回复列表 (共4个回复)

沙发

Can you learn how to stand-up before you learn algorithm?

板凳

haha, it's fun.

3 楼

请问高手 How to stand-up? 还有能不能劳教您修改一下 谢谢

4 楼

高手们啊 小弟再次跪求!

我来回复

您尚未登录,请登录后再回复。点此登录或注册