【发布时间】:2016-09-29 08:36:45
【问题描述】:
我正在尝试解决来自 Hackerrank (https://www.hackerrank.com/challenges/non-divisible-subset) 的不可分割子集问题。我试图使用这样的想法,即如果 a 和 b 的总和可被 k 整除,则 a%k+b%k = k,但是,它运行得不是很好。 以下是我目前所写的内容:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
int k;
cin >> n;
cin >> k;
int j;
vector<int>numbers;
vector<int>remainders;
for(int i = 0; i < n; i++) {
int z;
cin >> z;
numbers.push_back(z);
}
for (vector<int>::iterator it = numbers.begin(); it != numbers.end(); it++) {
j = *it % k;
remainders.push_back(j);
}
for(vector<int>::iterator it2 = remainders.begin(); it2 != remainders.end(); it2++) {
int remainderCount = 0;
int otherRemainderCount = 0;
otherRemainderCount = std::count(remainders.begin(), remainders.end(), k-*it2);
remainderCount = std::count(remainders.begin(), remainders.end(), *it2);
if (remainderCount > otherRemainderCount) {
theChosenOne = *it2;
} else if (otherRemainderCount > remainderCount) {
theChosenOne = k-*it2;
}
cout << theChosenOne << endl;
}
return 0;
}
我为余数创建了一个向量,并使用 std::cout 函数来找出向量中哪个余数出现得更多。如果 K 为 5,*it2 = 4,并且 k-*it2 = 1。如果 *it2 出现的次数更多,那么我会选择 *it2。否则,我会选择 k-*it2。
【问题讨论】:
-
您是否已经使用调试器检查过您的程序?
-
我真的不喜欢 HackerRank 和类似的东西。它(他们)鼓励不可维护的“可爱”一次性代码。
-
@MirunaCamelia “是的,它不起作用。” 这实际上太模糊了。请在您的问题中准确描述它是如何不起作用,并告诉我们您在使用调试器单步执行代码时观察到的情况。
-
@MartinBonner 你会推荐什么替代方案?
-
@0x499602D2:合适的课程或书籍。