脑筋急转弯的R问题-R中的编程问题解决

时间:2019-09-10 22:06:07

标签: r

我正在尝试编写一个函数来解决一个新问题:

给出以下数据:

S = c(19, 10, 12, 10, 24, 25, 22)
k = 4 

我正在尝试计算一个函数。我想打印S的最大子集,其中S'中2个数字的任何和不能被k均匀地除以

因此,一个答案可能是S' = [10, 12, 25],而另一个答案可能是S' = [10, 22, 24]

另一个例子:

如果S = {1, 7, 2, 4}K = 3

然后

1 + 7 = 8
1 + 2 = 3
1 + 4 = 5
7 + 2 = 9
7 + 4 = 11
2 + 4 = 6

S' = {1, 7, 4},并且永远不会是k = 3的倍数

1 个答案:

答案 0 :(得分:5)

对此有一个线性时间算法。 orezvani在stackexchange的计算机科学部分的post中对此算法进行了很好的解释。 我在R中翻译了orezvani伪代码:

max_subset<-function(S,K){
  R <- S %% K
  Res <- c()
  for(k in 1:(ceiling(K/2)-1)){
    index_k = which(R==k)
    index_K_k = which(R==(K-k))
    if(length(index_k) >= length(index_K_k)){
      Res <- c(Res, S[index_k])
    }else{
      Res <- c(Res, S[index_K_k])
    }
  }
  print(R)
  Res <- c(Res, S[which(R==0)][1])
  if(K %% 2 == 0){
    Res <- c(Res, S[which(R==(K/2))][1])
  }
  return(Res)
}

我尝试了其他示例:

  • S <- c(1, 7, 2, 4)K = 3一起给1 7 4;
  • S <- c(3, 17, 12, 9, 11, 15)K = 5一起给11 17 12 15
  • S <- c(3, 7, 2, 9, 1)K = 3一起给7 1 3
  • S <- c(19, 10, 12, 10, 24, 25, 22)K = 4一起给25 12 10

为了更容易理解,我尝试与伪代码尽可能相似,可能可以使用R语言特定的功能来优化我的解决方案。