当前位置:   article > 正文

华为oj 201301 JAVA题目0-1级_可信oj

可信oj

有人说用“背包问题”可以解决(没有验证),因为对于动态规划还是有些许抗拒,所以还是用别的方法解决!

思路如下:

1.把数据分成三类,第一类,能被5整除的(包括既能被5整除又能被3整除的);第二类,能被3整除的;第三类,其它数字。

2.分别算出前两类的数字和,sumj,sumk

3.将第三类数字进行划分组合(我程序实现的有bug,但是能通过oj,在划分组合时我只用了一次循环,这是远远不够的,正确的算法待日后更新吧!)

4.oj给的测试用例输出的应该都是true;

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int n, temp, a[100], b[100], c[100];
  7. int j, k, l, max = 0;
  8. int sumj, sumk, suml, tempsum;
  9. //初始化
  10. memset(a, 0, sizeof(int)* 100);
  11. memset(b, 0, sizeof(int)* 100);
  12. memset(c, 0, sizeof(int)* 100);
  13. j = k = l = 0;
  14. sumj = sumk = suml = 0;
  15. // 获取输入数据
  16. cin >> n;
  17. if (n < 2)
  18. {
  19. cout << "false" << endl;
  20. return 0;
  21. }
  22. for (int i = 0; i < n; i++)
  23. {
  24. cin >> temp;
  25. if (abs(temp) % 5 == 0)
  26. {
  27. a[j] = temp;
  28. j++;
  29. }
  30. else if (abs(temp) % 3 == 0)
  31. {
  32. b[k] = temp;
  33. k++;
  34. }
  35. else
  36. {
  37. c[l] = temp;
  38. l++;
  39. }
  40. }
  41. for (int i = 0; i < n; i++)
  42. {
  43. sumj += a[i];
  44. sumk += b[i];
  45. suml += c[i];
  46. }
  47. int i;
  48. tempsum = 0;
  49. for (i = 0; i < l; i++)
  50. {
  51. if (abs(sumj - sumk) == abs(suml - tempsum - tempsum))//将suml分成两部分tempsum 和 suml - tempsum,这两部分的差值和(sumj和sumk的差值)相同
  52. {
  53. break;
  54. }
  55. tempsum += c[i];
  56. }
  57. if (i < l)
  58. {
  59. cout << "true" << endl;
  60. }
  61. else
  62. {
  63. cout << "false" << endl;
  64. }
  65. return 0;
  66. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/625092
推荐阅读
相关标签
  

闽ICP备14008679号