如何解决代码121A?

时间:2015-08-14 16:16:56

标签: c++ recursion

我试图解决代码问题121A

http://codeforces.com/problemset/problem/121/A

但它在测试14中超出了时间限制

我想出的是生成所有可能的幸运数字直到10 ^ 9的范围,然后通过在可能性中寻找它来评估给定范围内的所有数字的下一个()然后我总结它们。我知道这是一种效率低下的方法但是我可以修改任何东西以提高复杂性吗?有什么建议吗?

这是我的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;

long long int Next(long long int x, vector <long long int> vec , int &i){
    for (i ; i < vec.size(); i++){
        if (vec[i] >= x){
            return vec[i];
        }
    }
}
void Generate(int size, vector <long long int> &v , string s = "" ){
    if (size == 0){
        long long int intStr = strtoll(s.c_str(), NULL, 10);
        v.push_back(intStr);

        return;
    }
    Generate(size - 1,v, s + "4");
    Generate(size - 1,v, s + "7");
}
long long int Sum(long long int l, long long int r,vector <long long int> vec){
    long long int sum = 0;
    int index = 0;
    for (long long int i = l; i <= r; i++){
        sum += Next(i,vec,index);
    }
    return sum;
}
int main(){

        long long int l, r;
        cin >> l >> r;
        vector <long long int> vec;
        for (int i = 1; i <= 10; i++){
            Generate(i,vec,"");
        }


        cout << Sum(l, r, vec);


}

3 个答案:

答案 0 :(得分:1)

Next始终从列表的开头搜索下一个值;一旦找到了第一个数字,你就不需要再进行搜索。

请注意,无论您需要多少,都会生成整个列表。

并且你只是在生成列表时构建字符串以将它们解析为数字,这可能比简单算术更慢。

Generate似乎重复了很多工作;例如,必须重新生成9位数的所有数字,以获得10位数。

答案 1 :(得分:0)

您的代码中不需要Next()函数。只需修改Sum函数,它就会在大约30 ms时间内运行。首先按升序排序幸运数字。假设x是第一个幸运数字>=l and <=r。因此,x将是范围next()中所有数字的[l,x]值。我们有x-l+1个这样的数字,他们会将(x-l+1)*x加到总和中。我们将此添加到sum后,x现在变为新的l。继续此过程,直到x>r我们将(r-l+1)*x添加到sum

代码:

long long int Sum(long long int l, long long int r, vector <long long int> vec){
    long long int sum=0;
    int index=0;
    sort(vec.begin(), vec.end());
    for(long long int i=0; i < vec.size(); i++){
        if(vec[i]>=l && vec[i]<=r) {
            sum+=(vec[i]-l+1)*vec[i];
            l=vec[i]+1;
        }
        else if(vec[i]>=l && vec[i]>r) {
            sum+=(r-l+1)*vec[i];
            break;
        }
    }
    return sum;
}

答案 2 :(得分:0)

我有一个python实现,该函数对sum函数使用相同的概念,但是您可以实现在O(n)中运行的下一个函数,其中n是数字的长度。代码如下。

def next(n,k):
 s = n
 n = int(n)

 if int("4"*k)>=n:
    return "4"*k
 elif int("7"*k)<n:
    return "4"*(k+1)
 elif 4<int(s[0])<7:
    return "7"+"4"*(k-1)
 if not s[1:]=="":
    a = next(s[1:],k-1)
    if s[0]=="4":

        if len(str(a))==k:
            return "7"+a[1:]
        else:
            return "4"+a
    else:
            return "7"+a
 else:
    return "7"

这里n是字符串格式,而k是该字符串的长度。