3 solutions

  • 2
    @ 2024-4-17 16:55:55

    思路

    记忆化递归

    不要用记忆化数组,可以用map

    递归式:

    f(x)=x+f(x2)+f(x2),x2f(x)=x+f(⌊\dfrac{x}{2}⌋)+f(⌈\dfrac{x}{2}⌉),x\ge 2

    这里可以考虑分偶数和奇数

    • 偶数要求出一个就可以了,因为一个偶数可以分为22个相同的数
    • 奇数就可以只求11个,要分开求

    代码

    #include<iostream>
    #include<map>
    #define int long long
    using namespace std;
    int n,sum=0;
    map<int ,int >mp;
    int fun(int x)
    {
        if(mp[x]!=0)//有记录时
        {
            return mp[x];//返回之前的值
        }
    	if(x>=2)
    	{
            if(x%2==0)//偶数
            {
                int l=fun(x/2);
                mp[x]=x+2*l;//乘两倍,记得保存
                return mp[x];
            }
            else//奇数
            {
                int f=fun(x/2),s=fun(x/2+1);//分两个部分
                mp[x]=x+f+s;//和,记得保存
                return mp[x];
            }
    	}
        return 0;
    }
    signed main()
    {
        cin>>n;//输入
        cout<<fun(n);//输出
        return 0;//完结散花
    }
    
    • 2
      @ 2024-4-16 13:05:13

      思路

      记忆化递归

      不要用记忆化数组,可以用map

      递归式:

      f(x)=x+f(x2)+f(x2),x2f(x)=x+f(⌊\dfrac{x}{2}⌋)+f(⌈\dfrac{x}{2}⌉),x\ge 2

      这里可以考虑分偶数和奇数

      • 偶数要求出一个就可以了,因为一个偶数可以分为22个相同的数
      • 奇数就可以只求11个,要分开求

      代码

      #include<iostream>
      #include<map>
      #define int long long
      using namespace std;
      int n,sum=0;
      map<int ,int >mp;
      int fun(int x)
      {
          if(mp[x]!=0)//有记录时
          {
              return mp[x];//返回之前的值
          }
      	if(x>=2)
      	{
              if(x%2==0)//偶数
              {
                  int l=fun(x/2);
                  mp[x]=x+2*l;//乘两倍,记得保存
                  return mp[x];
              }
              else//奇数
              {
                  int f=fun(x/2),s=fun(x/2+1);//分两个部分
                  mp[x]=x+f+s;//和,记得保存
                  return mp[x];
              }
      	}
          return 0;
      }
      signed main()
      {
          cin>>n;//输入
          cout<<fun(n);//输出
          return 0;//完结散花
      }
      
      • @ 2024-4-16 18:56:09

        \lceil \rceil\lceil \rceil

        \lfloor \rfloor\lfloor \rfloor

    • 0
      @ 2024-4-16 18:23:23

      题意

      题目没有难理解的地方,照着做就行了

      思路

      大家不用看我的暴力代码了

      记忆化递归就行了,但是得用 map,开数组会过大而 CE

      代码

      #include <bits/stdc++.h>
      #define int long long
      using namespace std;
      map<int,int> a;
      int dfs(int n){
      	if (a[n])	return a[n];
      	if (n < 2)	return 0;
      	if (n == 2)	return a[2] = 2;
      	bool jw = n % 2;
      	return a[n] = dfs(n >> 1) + dfs(n / 2 + jw) + n;
      }
      signed main(int argc, char **argv){
      	int n;
      	cin >> n;
      //	queue<int> q;
      //	q.push(n);
      //	while (!q.empty()){
      //		int x = q.front();
      //		sum += x;
      //		if ((x >> 1) >= 2)	q.push(x >> 1);
      //		if ((ceil(1.0 * x / 2)) >= 2)	q.push(ceil(1.0 * x / 2));
      //		q.pop();
      //	}
      	cout << dfs(n);
      	return 0;
      }
      
      

      update2024/4/16:update 2024/4/16 : 更新了无特判的代码

      • @ 2024-4-16 19:21:35

        没有任何特判的代码

        思路

        记忆化递归

        不要用记忆化数组,可以用map

        递归式:

        f(x)=x+f(x2)+f(x2),x2f(x)=x+f(⌊\dfrac{x}{2}⌋)+f(⌈\dfrac{x}{2}⌉),x\ge 2

        这里可以考虑分偶数和奇数

        • 偶数要求出一个就可以了,因为一个偶数可以分为22个相同的数
        • 奇数就可以只求11个,要分开求

        代码

        #include<iostream>
        #include<map>
        #define int long long
        using namespace std;
        int n,sum=0;
        map<int ,int >mp;
        int fun(int x)
        {
            if(mp[x]!=0)//有记录时
            {
                return mp[x];//返回之前的值
            }
        	if(x>=2)
        	{
                if(x%2==0)//偶数
                {
                    int l=fun(x/2);
                    mp[x]=x+2*l;//乘两倍,记得保存
                    return mp[x];
                }
                else//奇数
                {
                    int f=fun(x/2),s=fun(x/2+1);//分两个部分
                    mp[x]=x+f+s;//和,记得保存
                    return mp[x];
                }
        	}
            return 0;
        }
        signed main()
        {
            cin>>n;//输入
            cout<<fun(n);//输出
            return 0;//完结散花
        }
        
      • @ 2024-4-17 16:55:44

        差评,没有递推式

    • 1

    Information

    ID
    1052
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    189
    Accepted
    18
    Uploaded By