A company has employed N developers (numbered from 0 to N−1) and wants to divide them into two teams. The first is a front-end team with F developers. The second is a back-end team with N−F developers. If the K-th developer is assigned to the front-end team then their contribution is A[K], and if they are assigned to the back-end team then their contribution is B[K]. What is the maximum sum of contributions the company can achieve?
Write a function:
int solution(vector<int> &A, vector<int> &B, int F);
that, given two arrays A, B (consisting of N integers each) and the integer F, returns the maximum sum of contributions the company can achieve.
Examples:
1. Given A = [4, 2, 1], B = [2, 5, 3] and F = 2, the function should return 10. There should be two front-end developers and one back-end developer. The 0th and 2nd developers should be assigned to the front-end team (with contributions 4 and 1) and the 1st developer should be assigned to the back-end team (with contribution 5).
2. Given A = [7, 1, 4, 4], B = [5, 3, 4, 3] and F = 2, the function should return 18. The 0th and 3rd developers should be assigned to the front-end team and the 1st and 2nd developers should be assigned to the back-end team.
3. Given A = [5, 5, 5], B = [5, 5, 5] and F = 1, the function should return 15. The 0th developer can be assigned to the front-end team and the 1st and 2nd developers can be assigned to the back-end team.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..200,000];
- arrays A and B have equal lengths;
- each element of array A is an integer within the range [0..1,000];
- F is an integer within the range [0..N].
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
#include<bits/stdc++.h>
typedef struct node{
int a;
int b;
}node;
bool comp(node a, node b){
int d1 = abs(a.a - a.b);
int d2 = abs(b.a - b.b);
if(d1 > d2){
return true;
}
if(d1 == d2)
return true;
return false;
}
int solution(vector<int> &A, vector<int> &B, int F) {
int n = A.size();
node * arr = new node[n + 2];
for(int i=0; i<n; i++){
arr[i].a = A[i];
arr[i].b = B[i];
}
sort(arr, arr + n, comp);
int res = 0;
int cnta = 0, cntb = 0;
for(int i=0; i<n; i++){
if(arr[i].a >= arr[i].b){
if(cnta < F){
res += arr[i].a;
cnta++;
}
else{
res += arr[i].b;
cntb++;
}
}
else{
if(cntb < n - F){
res += arr[i].b;
cntb++;
}
else{
res += arr[i].a;
cnta++;
}
}
}
return res;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
#include<bits/stdc++.h>
typedef struct node{
int a;
int b;
}node;
bool comp(node a, node b){
int d1 = abs(a.a - a.b);
int d2 = abs(b.a - b.b);
if(d1 > d2){
return true;
}
if(d1 == d2)
return false;
return false;
}
int solution(vector<int> &A, vector<int> &B, int F) {
int n = A.size();
node * arr = new node[n + 2];
for(int i=0; i<n; i++){
arr[i].a = A[i];
arr[i].b = B[i];
}
sort(arr, arr + n, comp);
int res = 0;
int cnta = 0, cntb = 0;
for(int i=0; i<n; i++){
if(arr[i].a >= arr[i].b){
if(cnta < F){
res += arr[i].a;
cnta++;
}
else{
res += arr[i].b;
cntb++;
}
}
else{
if(cntb < n - F){
res += arr[i].b;
cntb++;
}
else{
res += arr[i].a;
cnta++;
}
}
}
return res;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
#include<bits/stdc++.h>
typedef struct node{
int a;
int b;
}node;
bool comp(node a, node b){
int d1 = abs(a.a - a.b);
int d2 = abs(b.a - b.b);
if(d1 > d2){
return true;
}
if(d1 == d2)
return false;
return false;
}
int solution(vector<int> &A, vector<int> &B, int F) {
int n = A.size();
node * arr = new node[n + 2];
for(int i=0; i<n; i++){
arr[i].a = A[i];
arr[i].b = B[i];
}
sort(arr, arr + n, comp);
int res = 0;
int cnta = 0, cntb = 0;
for(int i=0; i<n; i++){
if(arr[i].a >= arr[i].b){
if(cnta < F){
res += arr[i].a;
cnta++;
}
else{
res += arr[i].b;
cntb++;
}
}
else{
if(cntb < n - F){
res += arr[i].b;
cntb++;
}
else{
res += arr[i].a;
cnta++;
}
}
}
return res;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
#include<bits/stdc++.h>
typedef struct node{
int a;
int b;
}node;
bool comp(node a, node b){
int d1 = abs(a.a - a.b);
int d2 = abs(b.a - b.b);
if(d1 > d2){
return true;
}
if(d1 == d2)
return false;
return false;
}
int solution(vector<int> &A, vector<int> &B, int F) {
int n = A.size();
node * arr = new node[n + 2];
for(int i=0; i<n; i++){
arr[i].a = A[i];
arr[i].b = B[i];
}
sort(arr, arr + n, comp);
int res = 0;
int cnta = 0, cntb = 0;
for(int i=0; i<n; i++){
if(arr[i].a >= arr[i].b){
if(cnta < F){
res += arr[i].a;
cnta++;
}
else{
res += arr[i].b;
cntb++;
}
}
else{
if(cntb < n - F){
res += arr[i].b;
cntb++;
}
else{
res += arr[i].a;
cnta++;
}
}
}
return res;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
#include<bits/stdc++.h>
typedef struct node{
int a;
int b;
}node;
bool comp(node a, node b){
int d1 = abs(a.a - a.b);
int d2 = abs(b.a - b.b);
if(d1 > d2){
return true;
}
if(d1 == d2)
return false;
return false;
}
int solution(vector<int> &A, vector<int> &B, int F) {
int n = A.size();
node * arr = new node[n + 2];
for(int i=0; i<n; i++){
arr[i].a = A[i];
arr[i].b = B[i];
}
sort(arr, arr + n, comp);
int res = 0;
int cnta = 0, cntb = 0;
for(int i=0; i<n; i++){
if(arr[i].a >= arr[i].b){
if(cnta < F){
res += arr[i].a;
cnta++;
}
else{
res += arr[i].b;
cntb++;
}
}
else{
if(cntb < n - F){
res += arr[i].b;
cntb++;
}
else{
res += arr[i].a;
cnta++;
}
}
}
return res;
}
The solution obtained perfect score.
N = 20. Some developers have small difference between A[i] and B[i].
N = 300. Some developers have small difference between A[i] and B[i].
N = 200,000. Some developers have small difference between A[i] and B[i].