我正在尝试从Hackerrank(clearstatcache
)解决不可分的子集问题。我试图使用这样的想法:如果a和b的总和可以被k整除,那么%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。
答案 0 :(得分:1)
您的解决方案看起来正确,但需要进行一些更改。
您基本上需要将数组中的数字哈希到正确的位置。
将数组rem[k]
初始化为0。
迭代数组中的n
数字,并执行以下操作:
rem[array[i]%k]++;
现在你必须只处理rem[]
数组,才能找到最大的子集。 rem
数组的大小为k<=100
。利用小尺寸的rem[]
数组有效地找到解决方案。
修改:为您添加代码。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n,i,k;
cin>>n>>k;
int arr[n];
int rem[k]={0};
for(i=0;i<n;i++)
{
cin>>arr[i];
}
for(i=0;i<n;i++)
{
rem[arr[i]%k]++;
}
int count = 0;
for(i=1;i<=k/2;i++)
{
count = count + max(rem[i],rem[k-i]);
}
count = count + (rem[0]>0?1:0);
if(k%2==0)
{
count = count - rem[k/2];
if(rem[k/2]>0)
count = count + 1;
}
cout<<count;
return 0;
}
找到rem[]
数组的内容后,找到最大子集的时间。如果您选择rem[1]
,则无法选择rem[k-1]
作为任意两个数字,一个来自rem[1]
而另一个来自rem[k-1]
可以汇总在一起,可以被{{1}整除我们不想要的。因此,我们会找到k
和rem[i]
中的最大值,并将其添加到计数
我的代码使用上述逻辑..
希望它有所帮助!!!
答案 1 :(得分:0)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
答案 2 :(得分:0)
这似乎可行
#include <stdio.h>
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int main() {
int n, k, a, total = 0;
scanf("%d %d", &n, &k);
int mods[k];
for (int i = 0; i < k; i++)
mods[i] = 0;
while (n--) {
scanf("%d", &a);
mods[a % k]++;
}
// can only have 1 value congruent to 0 mod k
total += min(1, mods[0]);
// if even, can only have 1 value congruent to k/2 mod k
if (k % 2 == 0)
total += min(1, mods[k / 2]);
// for all others, pick max of those k and n-k mod k
for (int d = 1; d < (k + 1) / 2; d++) { // for all others,
total += max(mods[d], mods[k - d]);
}
printf("%d", total);
return 0;
}