Ex:

问题描述 投票:-2回答:1
6

10 100 30 80 50 50

100 30 40 90 40 60

最小为:

130

1 3 4

2 5 6

说明:

res = max(a [1] + a [3] + a [4],a [2] + a [5] + a [6])= max(10 + 30 + 80,30 + 40 + 60 )= max(120,130)= 130

#include <bits/stdc++.h> #define N 101 using namespace std; int n,res; int a[N],b[N],x[N]; void Solve() { int SumA=0,SumB=0; for (int i=1;i<=n;i++) { if (x[i]==1) { SumA+=a[i]; } else SumB+=b[i]; } res=min(res,max(SumA,SumB)); } void Try(int i) { for (int j=0;j<=1;j++) { x[i]=j; if (i==n) Solve(); else Try(i+1); } } int main() { res=1000000009; cin >> n; for (int i=1;i<=n;i++) cin >> a[i]; for (int i=1;i<=n;i++) cin >> b[i]; Try(1); cout << res; return 0; }

c++ algorithm
1个回答
0
投票
排序该数组,升序,<=仅由三元组中的第一个值定义

前n个元素现在基本上是解决方案

  • 编辑:Θ(Nn + nlogn)变体:
  • 从上面的第一点创建数组

    创建长度为n的数组,其中包含数组的前n个元素

  • 排序第二个数组,<=如上定义

      迭代第一个数组,从第n + 1个元素开始
    • 将当前元素气泡到第二个数组中
    • 从第二个数组中删除最后一个元素
  • 迭代后,第二个数组包含解决方案
  • © www.soinside.com 2019 - 2024. All rights reserved.