题解 | #第二题#

第二题

https://www.nowcoder.com/practice/aea0458d54d74f3ca14012cbdf249918

#include <iostream>
#include <sstream>
#include <vector>
#include <cmath>
using namespace std;int sum=0,cnt=0;int mini=0x3f3f3f3f;int f=0;int n=0;
void dfs(int i,vector<int>& nums,int s){ 
   if(i>=n||f||cnt==sum/2) return;
    if(nums[i]>sum/2) {f=1;cnt=nums[i];return;}//当前元素的值大于一半的总和,这个元素单独一组,其他dfs可以结束
    int now=abs(sum-2*s);//计算当前差值绝对值
    if(now<mini) {mini=now;cnt=s;}//更新最小差值,更新答案
    if(s>=sum/2) return;//无需后续dfs
    dfs(i+1,nums,s+nums[i]);//加上当前元素
    dfs(i+1,nums,s);//不加
}
int main() {
    stringstream ss;
string s;
    while (getline(cin,s)) { // 注意 while 处理多个 case
     vector<int> nums; sum=0;cnt=0;mini=0x3f3f3f3f;f=0;
       ss.clear();ss.str(""); ss<<s;int flag=0;
        while (ss>>s) {
         for(int i=0;i<s.size();i++){
            if(!isdigit(s[i])) {flag=1;break;}
        }
     if(flag) break;  
 nums.push_back(stoi(s));sum+=stoi(s);
}
 if(flag) {cout<<"ERROR"<<endl;continue;}n=nums.size();
dfs(0,nums,0);
cout<<max(cnt,sum-cnt)<<' '<<min(cnt,sum-cnt)<<endl;
    }
}

全部评论

相关推荐

10-15 20:01
已编辑
上海大学 Java
钉钉什么垃圾公司,约面鸽人
Syca_:途虎养车给我定了我这边早上六点的笔试,睡了四个小时起来难受的要命,告诉我面试时间是两天后的凌晨四点
点赞 评论 收藏
分享
迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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