小编Doc*_*sha的帖子

一个王国的公平分裂

最近,我参加了编程比赛.有一个问题,我仍然在考虑.编程语言并不重要,但我用C++编写.任务是这样的:

如您所知,Flatland位于飞机上.Flatland有n个城市,其中i个城市位于(xi,yi)点.有AI的公民居住在第i个城市.平地之王决定将王国分配给他的两个儿子.他想以无限直线的形式建造一堵墙; 每个部分将由其中一个儿子统治.墙不能穿过任何城市.为了避免兄弟之间的嫉妒,两部分的人口必须尽可能接近; 正式地,如果ab分别是居住在第一和第二部分城市的公民总数,则| a - b |的值.必须尽量减少.帮助国王找到最佳分工.城市数量小于1000.所有坐标都是整数.算法的输出应该是最小| ab |的整数

好吧,如果我知道线的方向,那将是非常简单的任务 - 二进制搜索: 黑色数字是城市人口,红色是该部分的总人口

我不想要代码,我想要想法,因为我没有.如果我抓住了想法,我可以编写代码!

我不知道最佳方向,但我认为它可以以某种方式找到.那可以找到它还是以其他方式解决这个问题?

水平/垂直线不是最佳的示例:

1

\
 \
2 \      1
Run Code Online (Sandbox Code Playgroud)

algorithm

25
推荐指数
1
解决办法
1495
查看次数

为什么移动构造函数在这里调用?

这是来自C++测验的代码示例:

#include <iostream>
struct X {
    X(const char *) { std::cout << 1; }
    X(const X &) { std::cout << 2; }
    X(X &&) { std::cout << 3; }
};

X f(X a) {
    return a;
}

X g(const char * b) {
    X c(b);
    return c;
}

int main() {
    f("hello");
    g("hello");
}
Run Code Online (Sandbox Code Playgroud)

该计划的输出是什么?

我想是这样的:

  1. f(X a)被调用,构造函数隐式转换const char*为X,因此输出为1
  2. 由于我们没有存储返回值的对象,因此返回值被丢弃,没有输出
  3. g(const char*)被调用,X c(b) X(const char*) 输出为1
  4. 返回值再被丢弃一次 - 没有输出

所以答案是11.给测验的答案是131.我用g ++ 4.4.4-13得到的答案是121.

据说这段代码是用这个命令编译的: …

c++ move-semantics c++11

15
推荐指数
1
解决办法
1084
查看次数

放置新对象是否会启动对象的生命周期?

以下代码示例来自 cppreference 上std::launder

alignas(Y) std::byte s[sizeof(Y)];
Y* q = new(&s) Y{2};
const int f = reinterpret_cast<Y*>(&s)->z; // Class member access is undefined behavior
Run Code Online (Sandbox Code Playgroud)

在我看来,由于标准中的[basic.life]/6,第三行将导致未定义的行为:

在对象的生命周期开始之前,但在分配对象将占用的存储空间之后...如果...指针用于访问非静态数据成员或调用非静态,则程序具有未定义的行为对象的成员函数。

为什么placement new没有开始object的生命周期Y

c++ c++17 stdlaunder

9
推荐指数
1
解决办法
477
查看次数

固定楼层算法

好吧,我有这个任务:John的浴室地板坏了.我们有一张这个楼层的地图,其中'.' 是好板,'+'是坏板,例如:

.+++
.+.+
Run Code Online (Sandbox Code Playgroud)

在这里,我们有5个破碎板和3个好板.有两种板材,在商店出售:1x1板和2x1板.1x1板材成本A和2x1板材成本B.任务是:给出地板图,计算地板固定的最低价格.

以顶部为例:我们可以放置2个2x1板和1个1x1板.因此,价格将是A + 2*B.

我有一个想法:每个破碎的板数计算连接断板的最大长度.然后价格是长度/ 2*B +长度%2*A.

问题是,我真的不知道该怎么做.我有一些递归算法的想法,但也有那么像圈诸多问题:

+++
+.+
+++
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  1. 我正朝着正确的方向前进吗?
  2. 你能给我一些关于实现这个算法的提示吗?

谢谢!

编辑

当2*A <B时有一些小问题,但让我们谈谈非平凡=)

/编辑

algorithm

8
推荐指数
1
解决办法
211
查看次数

如何在c ++中利用multi-cpu?

我在实验室工作并编写了多线程计算程序,在C++ 11上使用std::thread.现在我有机会在多CPU服务器上运行我的程序.

服务器:

  • 运行Ubuntu服务器
  • 拥有40个Intel CPU

我对多CPU编程一无所知.第一个想法,我想到了运行40个应用程序然后将它们的结果粘合在一起.这是可能的,但我想更多地了解我的机会.

  1. 如果我通过它的gcc编译器在服务器上编译我的代码,结果应用程序是否利用了多CPU?
  2. 如果#1答案取决于,我该如何检查?

谢谢!

c++ cpu multithreading cpu-usage c++11

7
推荐指数
2
解决办法
1835
查看次数

如何对自定义gcc库强制执行cmake链接

在cmake生成makefile之后,我尝试使用自定义 gcc 编译程序。我已经完成以下工作:

  1. 从源代码编译了gcc 5.2.0
  2. CMAKE_CXX_COMPILER假设将cmake变量设置为定制路径/home/user/pkgs/bin/g++
  3. Ran cmake,成功完成
  4. 然使,它也成功完成

但是,当我尝试运行程序时,它显示如下错误信息: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found

在我看来,问题在于链接到中的旧库/usr/lib,而应该链接到cutom gcc库。

我怎样才能解决这个问题?

c++ linux gcc cmake

6
推荐指数
1
解决办法
2803
查看次数

查找具有所有数字的最小长度子数组

文件input.txt由两行组成:首先具有整数N个空格,然后具有整数K(1 ?? N,K ?? 250000)。第二个具有N个以空格为单位的整数,其中每个整数都小于或等于K。可以保证数组中从1到K的每个整数。任务是找到最小长度的子数组,其中包含所有整数。并打印其开始和结束。请注意,索引从1开始。

例子:

Input         Output
5 3           2 4
1 2 1 3 2

6 4           2 6
2 4 2 3 3 1  
Run Code Online (Sandbox Code Playgroud)

在最近的编程竞赛中,我承担了这项任务。结束了,我没有作弊。我已经使用python 3实现了它:

with open('input.txt') as file:
    N, K = [int(x) for x in file.readline().split()]
    alley = [int(x) for x in file.readline().split()]

trees = {}
min_idx = (1, N)
min_length = N
for i in range(N):
    trees[alley[i]] = i
    if len(trees) == K:
        idx = (min(trees.values())+1, max(trees.values())+1)
        length = idx[1] - idx[0] + 1 …
Run Code Online (Sandbox Code Playgroud)

python arrays algorithm sub-array

5
推荐指数
1
解决办法
456
查看次数

使用weak_ptr作为参数重载分辨率的函数

我有:

class A : public std::enable_shared_from_this<A>
{...};

class B : public A
{...}; 

void doCoolStuff(std::weak_ptr<A> obj)
{...}

void doCoolStuff(std::weak_ptr<B> obj)
{
 ...
 doCoolStuff(std::static_pointer_cast<A>(obj.lock())); (1)
}
Run Code Online (Sandbox Code Playgroud)

然后在B函数中:

void B::doReallyCoolStuff()
{
 doCoolStuff(std::static_pointer_cast<B>(shared_from_this())); (2)
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  1. 编译错误: error C2440: 'static_cast' : cannot convert from 'B *const ' to 'A *'
  2. 编译错误: error C2668: ambiguous call to overloaded function

我不明白如何解决它们中的任何一个,因为:

  1. 我认为它以某种方式与shared_from_this连接,因为这是const指针.但我不知道如何在没有const_cast的情况下处理这种情况.
  2. 我不知道函数是否可以被不同类型的弱指针重载.

构建环境:MSVS 2013 express

请帮忙.谢谢

c++ smart-pointers static-cast weak-ptr c++11

3
推荐指数
1
解决办法
704
查看次数

多线程应用程序中的QTimer

好的,所以我在QTimer中完全迷失了.问题是:我有多线程应用程序,我需要在QTimer的超时上做一些工作.我这样做了:

QTimer* timer = new QTimer();
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), someObject, SLOT(work()));
Run Code Online (Sandbox Code Playgroud)

这没用.有时,work()根本没有被调用,有时它在我关闭程序时被调用,有时候看起来都很正常.
所以我开始想到计时器需要线程.提供MCV示例:

class Tester : public QObject
{
 Q_OBJECT
 public:
 Tester(QObject* par = 0) : QObject(par)
 {
 }
 public slots:
 void greet()
 {
  qDebug()<<"hello";
 }
};

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

 QTimer* timer1 = new QTimer();

 QThread* thread = new QThread();
 Tester* tester = new Tester();

 timer1->setInterval(500);
 timer1->setSingleShot(false);
 timer1->moveToThread(thread);


 QObject::connect(thread, SIGNAL(started()), timer1, SLOT(start()));

 QObject::connect(timer1, SIGNAL(timeout()), tester, SLOT(greet()));

 QObject::connect(timer1, SIGNAL(timeout()), timer1, SLOT(deleteLater()));
 QObject::connect(timer1, SIGNAL(destroyed()), thread, SLOT(quit())); …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading qtimer

1
推荐指数
1
解决办法
2333
查看次数