#华为OD#机试第三题

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    vector<int> pr;//用来记录输入数据
    vector<int> chazhi;//记录差值数据
    int input;
    int result(0);
    while (cin >> input) //获取输入
    {
        pr.push_back(input);
    }

    sort(pr.begin(), pr.end());//排序从小到大

    for (int i = 0; i < 9;)
    {
        chazhi.push_back(pr[i] - pr[i + 1]);//记录差值 10个队员 5个差值
        //比如示例中的就是-1 -1 -1 -1 -1
        //我先分配1 2战斗力在A,B两个队伍,那么A-B就是-1,我将下一组队员的调换进行分配那么就是+1,总的差值就是0。
        i = i + 2;
    }
    for (int it : chazhi)
    {
        result = min(abs(result + it), abs(result - it));//选取总的差值绝对值最小的一方
    }
    cout << result;
}
就我的思路哪里有问题嘞...就过15%用例。我觉得离谱...也没说要输出方案啊

#华为#
全部评论
我当时也是这道题,我用的方法是先总和为sum,然后深度优先遍历,10个里边选5个,和为sum1,剩余5个和为sum2,然后取差值最小sum1-sum2,AC了,楼主可以自己多举几个例子看看能不能找出不符合的情况,再试试自己思路
2 回复 分享
发布于 2022-05-09 14:40
--接上条 for (int a = 0; a < 6; a++)     {         for (int b = a + 1; b < 7; b++)         {             for (int c = b + 1; c < 8; c++)             {                 for (int d = c + 1; d < 9; d++)                 {                     for (int e = d + 1; e < length; e++)                     {                         A = vec[a];                         B = vec[b];                         C = vec[c];                         D = vec[d];                         E = vec[e];                         sum2 = A + B + C + D + E; // 取值总和*2最接近总数的一半                         curDiff = GetMosValue(sum1 - sum2, sum2);// 取两队战力之差                         if (min > curDiff)                         {                             min = curDiff;                         }                     }                 }             }         }     }       cout << min;     return 0; }
1 回复 分享
发布于 2022-05-09 09:27
static int min; static int sum; public static void dfs(int a[] ,int len,int idx,int zsum) { if(len==5) { int dif=Math.abs(sum-2*zsum); if(min>dif)min=dif; return; } for(int i=idx;i<10&&i<idx+6;i++) { dfs(a, len+1, i+1, zsum+a[i]); } }
点赞 回复 分享
发布于 2022-10-16 10:12 江苏
直接将总战力/2,然后递归获取到最接近总战力一半的5个相加的数,然后计算差值应该就可以了
点赞 回复 分享
发布于 2022-08-26 18:45 湖南
我有一个思路不知道正不正确,设定两个数组s1 s2,先将战力从大到小排序,便利战力数组,将战力元素始终往小的战力总和数组(s1 或s2 )中放,直到放满,然后比较两个数组的差值
点赞 回复 分享
发布于 2022-05-10 20:59
c++语言满分答案(并非最优解,但是是满分)   // 取绝对值 int GetMosValue(int a, int b) {     return (a - b < 0) ? (b - a) : (a - b); }   int main() {     // 暴力穷举     int sum1 = 0;     int sum2 = 0;     int preDiff = 0;     int curDiff = 0;     int min = 0xFFFF;     int length = 10;     int A, B, C, D, E = 0;     std::vector<int> vec;     vec.resize(length);     for (int i = 0; i < length; i++)     {         cin >> vec[i];         sum1 += vec[i];     }     std::sort(vec.begin(), vec.end());     --篇幅限制,见第二条评论。
点赞 回复 分享
发布于 2022-05-09 09:27

相关推荐

机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
07-16 17:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
3
27
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务