Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我该如何回答这样的问题?_C++_Logic - Fatal编程技术网

C++ 我该如何回答这样的问题?

C++ 我该如何回答这样的问题?,c++,logic,C++,Logic,各位晚上好。我不确定在这个平台上问这样的问题是否违反规定,如果是,请告诉我。问题是练习赛。我可以完成10个测试用例中的5个,但我不确定这有什么错。请提出任何更正/逻辑/提示。。。根据给定的输入,时间复杂度必须小于^2 我尝试的方法是: int main{ /*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/ 符号长整数t,n; 扫描%d,&t; 对于int i=1;我关于早期设置的一些事情 1从您给出的输入示例中,似乎t和每个n都需要顺序输入,但您的代码在接收下一个输入之前打印出漂亮

各位晚上好。我不确定在这个平台上问这样的问题是否违反规定,如果是,请告诉我。问题是练习赛。我可以完成10个测试用例中的5个,但我不确定这有什么错。请提出任何更正/逻辑/提示。。。根据给定的输入,时间复杂度必须小于^2

我尝试的方法是:

int main{ /*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/ 符号长整数t,n; 扫描%d,&t;
对于int i=1;我关于早期设置的一些事情

1从您给出的输入示例中,似乎t和每个n都需要顺序输入,但您的代码在接收下一个输入之前打印出漂亮的数字。我建议先读取t,然后循环通过大小为t的数组,以首先获取所有输入


2未测试约束。我将测试t和前面提到的数组中的每个值是否满足约束,如果不满足,请用户重试,或者干脆中止。

这不是一个复杂的问题。 假设您的输入是正确的,这样我们就不必进行任何检查:

如果数字n是一位数,则美丽数字的数量为b=n。 如果数字n是两位数,第一位数是f,那么美丽数字的数量b=9+x,其中x是小于n的所有美丽两位数的数字, 如果数字n是三位数,第一位数是f,那么美丽的数字b=2x9+x,其中x是所有小于n的美丽三位数的数字。 等等 因此,我们可以推断:如果数字n有d个数字,那么比美丽数字的数量还要多

s=d-1*9+x

其中x是一组小于或等于n的漂亮的d位数字。 因此,您的问题被简化为查找x。这可以进一步简化。以数字n=44437为例。这里重要的数字是第一位数字f。很容易看出,所有以单个数字小于f开头的5位美丽数字都是ok的。在我们的示例中,11111、22222、33333是ok的,而4444和更大的数字则不是。

所以,您需要做的就是检查美丽的数字fffff是否小于或等于n。这可以通过简单地遍历输入字符串来完成。 因此,您的解决方案是:

s=d-1*9+f-1+超级秘酱

其中:

s-解

n–您输入的年龄数

d–假设您的输入始终正确,则位数为lengthn

f–数字n的第一位数字

超级秘酱–如果fff…f小于或等于n,则为1;如果fff…f大于或等于n,则为0。 甚至输入字符串的遍历也可以优化,但我把它留给您


哦,是的……这个解决方案的时间复杂度为On=lengthn=log10n。

对于这个问题,考虑到您正在处理的工作区域相对较小,小于10^9的漂亮数字的数量可以合理地用这些值的表来处理,下面是一个使用所有b按排序顺序排列的数字

一旦建立了表格,只需进行二进制搜索即可确定输入值之前出现的美丽数字的数量。表格中最接近的美丽数字的位置就是我们需要的美丽数字的数量

二进制搜索是通过使用来完成的。此函数将向大于搜索项的项返回一个迭代器。然后为了获得位置,我们使用std::distance减去1,因为std::upper_bound将为我们提供大于搜索项的项

表的生成可以在编译时手动完成,只需初始化一个数组,或者如果您很懒,则在运行时通过一个简单的循环生成。下面是一个这样的解决方案:

#include <algorithm>
#include <vector>
#include <iostream>

std::vector<int> values;

int generate_value(int digit, int numTimes)
{
    int total = 0;
    for (int i = 0; i < numTimes; ++i)
        total = 10 * total + digit;
    return total;
}

// I'm lazy, so let the program generate the table for me
void generate_values()
{
    size_t curIdx = 0;
    values.push_back(0);
    for (int i = 1; i <= 9; ++i)
    {
        for (int j = 1; j <= 9; ++j)
            values.push_back(generate_value(j, i));
    }
    values.push_back(1111111111);
}

// does a binary search and returns the position of the beautiful number
int beautiful(int num)
{
    if (num == 0)
        return 1;

    // get iterator to closest number equaling the beautiful number
    auto iter = std::upper_bound(values.begin(), values.end(), num);

    // get distance from beginning of vector
    return std::distance(values.begin(), iter) - 1;
}

int main()
{
    generate_values();
    std::cout << beautiful(18) << "\n";;
    std::cout << beautiful(1) << "\n";;
    std::cout << beautiful(9) << "\n";;
    std::cout << beautiful(100500) << "\n";;
    std::cout << beautiful(33) << "\n";;
    std::cout << beautiful(1000000000) << "\n";;
}

表的大小总计为83个条目,因此对此表进行二进制搜索只需进行log83检查即可找到值,该值在表中最多为7个探测。

您的标题不具有描述性。请编写一个标题,总结具体问题。请查看此处:。此外,听起来您好像在试图让我们执行w为您工作。在您的计算中可以避免使用std::string:to_stringn.length可能会被floorlog10n+1替换。to_stringx.length x<100您是否真的想到,打印所有九个所谓美丽的数字,例如,三位数长,特别是111到999,可以在不单独打印的情况下完成将每个数字从100到999按一下,看看它是否是一个所谓的美丽数字?如果你花点时间思考这个事实,并将你的大脑围绕它,你会想到一个更简单的解决方案,你应该意识到上面显示的所有代码都是一个完全错误的方法
你为什么把实际问题以图片的形式发布,而不是以文本的形式复制粘贴?图像使问题更难理解,更难阅读。@churill-PrtScr;为什么复杂性会出现?如果这就是你所计算的,那么还有更快的方法,与你的方法完全不同。例如,按排序顺序预先生成整个美丽数字表,然后只需对该表进行二进制搜索。@PaulMcKenzie复杂性实际上是lengthn,因为实际上只需遍历数字n的输入字符串。或者,如果你在数字域中工作,你必须构造一个漂亮的长度为d的数字,并将其与n进行比较,n也可以归结为Od。你的建议可能是有希望的,当然你会用时间要求来换取空间要求,但是因为漂亮的数字很少,所以它可能会奏效。对于每一个美丽的数字,你还必须预先编译较小美丽数字的数字。@PaulMcKenzie请原谅我的错误。我已经打了一个关于上的字。我已经编辑了我的答案。复杂度实际上是On=lengthn,取决于位数。当然,使用表在空间上有一个折衷。我将发布一个答案。@user6694745晚上好。我理解你的大部分逻辑,我觉得我们得出了相同的结论,但你做得很出色。但我有一个问题:超级秘制酱汁背后的逻辑是什么?我想它是指一位数,让我解释一下。如果n=8,f=8。d=1。因此,count=0+8-1+超级秘方。在这种情况下,自民联投票支持这项努力。所有这些推回都会导致大量新的分配。推回并不是任何需要关注的事情——我只是这样做,因为我决定以这种方式创建初始表。没有什么能阻止任何人简单地创建一个83的数组,并将漂亮的数字硬编码到数组中。我在回答中提到过。constexpr std::array generate_beautifuly_numbers是另一种选择。@PaulMcKenzie晚上好。首先,先生,你提供了一个完全不同的方法来解决这个问题。我惊讶于生成一个漂亮的数字是多么的容易,我想我必须在我的逻辑技能上下很多功夫。显然,这是时间和空间之间的一种权衡,但它是有效的。我想做的一个更正是返回std::distancevalues.begin,iter-1;当向量从0开始计数时,会给出比我们需要的numberInstance少一个。这是一个不同的结果。因此,通过直接返回values.begin&ter之间的距离,程序运行了。@beardedoll-是的,我有点纠结于是否应该减去1。但总体思路是,答案要么就在二进制搜索结果的前端,要么就在下面。因此,这几乎可以归结为一个问题,即需求是什么,以及可能在上限调用后进行健全性检查。如果我事先在数组中获取输入,我将需要另一个循环来访问数组的元素并逐个传递输入,因此在这种情况下,我认为应该同时进行。
10
1
9
45
12
81