#30824: TLE 求解


buanyz03 (張晁瑋)

學校 : 新北市立板橋高級中學
編號 : 2629
來源 : [114.25.190.198]
最後登入時間 :
2023-09-06 15:43:50

#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
vector <string> v;
int n;
void dfs(int cur_sum,int k,string s)
{
    string temp;
    if(cur_sum == n)
    {
        v.push_back(s);
        return;
    }
    if(cur_sum>n)
    {
        return;
    }
    temp = s + " + " + to_string(k+1);
    dfs(cur_sum+k+1,k+1,temp);

    temp = s + " * 2";
    dfs(cur_sum * 2,k,temp);
}
int main()
{
    cin.sync_with_stdio(false), cin.tie(0);
    while(cin>>n)
    {
       if(n==0)
       {
           break;
       }
       v.clear();
       dfs(1,1,"1");
       if(v.size() == 0)
       {
          cout<<"cheat!"<<endl;
       }
       for(int i=0;i<v.size();++i)
       {
           cout<<v[i]<<endl;
       }
    }
}

#30832: Re: TLE 求解


asnewchien@gmail.com (david)

學校 : 南投縣立旭光高級中學
編號 : 68108
來源 : [114.42.176.221]
最後登入時間 :
2025-10-04 22:52:03

這題可以只遞迴一次,建表,後面查表。

 

#30848: Re: TLE 求解


buanyz03 (張晁瑋)

學校 : 新北市立板橋高級中學
編號 : 2629
來源 : [114.25.190.198]
最後登入時間 :
2023-09-06 15:43:50

這題可以只遞迴一次,建表,後面查表。

 

 

#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
vector <string> v[401];
int n;
void dfs(int cur_sum,int k,string s)
{
    string temp;
    if(cur_sum>400)
    {
        return;
    }
    v[cur_sum].push_back(s);

    temp = s + " + " + to_string(k+1);
    dfs(cur_sum+k+1,k+1,temp);

    temp = s + " * 2";
    dfs(cur_sum*2,k,temp);
}

int main()
{
    cin.sync_with_stdio(false), cin.tie(0);
    for(int i=1;i<=400;++i)
    {
        v[i].clear();
    }
    dfs(0,1,"");
    while(cin>>n)
    {
       if(n==0)
       {
           break;
       }

       if(v[n].size() == 0)
       {
          cout<<"cheat!"<<endl;
       }
       for(int i=0;i<v[n].size();++i)
       {
           cout<<v[n][i]<<endl;
       }
    }
}

只遞迴一次會爆掉
有沒有參考程式碼

#30849: Re: TLE 求解


asnewchien@gmail.com (david)

學校 : 南投縣立旭光高級中學
編號 : 68108
來源 : [114.42.176.221]
最後登入時間 :
2025-10-04 22:52:03

string d[401] = {""};

void dv(string v, int rv, int nxt)
{
    if(rv > 400) return;
    d[rv] = d[rv].append(v).append("\n");
    if(rv+nxt <= 400) dv(v + " + " + to_string(nxt), rv+nxt, nxt + 1);
    if(rv*2 <= 400) dv(v + " * 2", rv*2, nxt);
}

dv("1", 1, 2);

 

 

#30865: Re: TLE 求解


buanyz03 (張晁瑋)

學校 : 新北市立板橋高級中學
編號 : 2629
來源 : [114.25.190.198]
最後登入時間 :
2023-09-06 15:43:50

string d[401] = {""};

void dv(string v, int rv, int nxt)
{
    if(rv > 400) return;
    d[rv] = d[rv].append(v).append("\n");
    if(rv+nxt <= 400) dv(v + " + " + to_string(nxt), rv+nxt, nxt + 1);
    if(rv*2 <= 400) dv(v + " * 2", rv*2, nxt);
}

dv("1", 1, 2);

 

真的非常謝謝大神指導