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:
class Solution { public int solution(int[] A, 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].
using System;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
}
}
using System;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
int[] A = { 9, 4, 10, 2, 8, 5 };
int[] B = { 5, 4, 11, 9, 9, 9 };
int N = A.Length;
int BE = N - F;
Dictionary<int, int> frontend = new Dictionary<int, int>();
Dictionary<int, int> backend = new Dictionary<int, int>();
Dictionary<int, int> neutral = new Dictionary<int, int>();
for (int i = 0; i < N; i++)
{
if (A[i] > B[i])
{
frontend.Add(i, A[i]-B[i]);
}
else if (B[i] > A[i])
{
backend.Add(i, B[i]-A[i]);
}
else
{
neutral.Add(i, 0);
}
}
bool[] tmp = new bool[N];
int sum = 0;
foreach (var item in frontend.OrderByDescending(x => x.Value))
{
if (F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = true;
F--;
}
}
foreach (var item in backend.OrderByDescending(x => x.Value))
{
if (BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = true;
BE--;
}
}
if (F > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (F > 0)
{
foreach (var item in backend)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (BE > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
if (BE > 0)
{
foreach (var item in frontend)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
return sum;
}
}
Compilation failed: 2 error(s), 0 warnings Solution.cs(11,16): error CS0128: A local variable named `A' is already defined in this scope Solution.cs(12,19): error CS0128: A local variable named `B' is already defined in this scope
using System;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
int N = A.Length;
int BE = N - F;
Dictionary<int, int> frontend = new Dictionary<int, int>();
Dictionary<int, int> backend = new Dictionary<int, int>();
Dictionary<int, int> neutral = new Dictionary<int, int>();
for (int i = 0; i < N; i++)
{
if (A[i] > B[i])
{
frontend.Add(i, A[i]-B[i]);
}
else if (B[i] > A[i])
{
backend.Add(i, B[i]-A[i]);
}
else
{
neutral.Add(i, 0);
}
}
bool[] tmp = new bool[N];
int sum = 0;
foreach (var item in frontend.OrderByDescending(x => x.Value))
{
if (F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = true;
F--;
}
}
foreach (var item in backend.OrderByDescending(x => x.Value))
{
if (BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = true;
BE--;
}
}
if (F > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (F > 0)
{
foreach (var item in backend)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (BE > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
if (BE > 0)
{
foreach (var item in frontend)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
return sum;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
int N = A.Length;
int BE = N - F;
Dictionary<int, int> frontend = new Dictionary<int, int>();
Dictionary<int, int> backend = new Dictionary<int, int>();
Dictionary<int, int> neutral = new Dictionary<int, int>();
for (int i = 0; i < N; i++)
{
if (A[i] > B[i])
{
frontend.Add(i, A[i]-B[i]);
}
else if (B[i] > A[i])
{
backend.Add(i, B[i]-A[i]);
}
else
{
neutral.Add(i, 0);
}
}
bool[] tmp = new bool[N];
int sum = 0;
foreach (var item in frontend.OrderByDescending(x => x.Value))
{
if (F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = true;
F--;
}
}
foreach (var item in backend.OrderByDescending(x => x.Value))
{
if (BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = true;
BE--;
}
}
if (F > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (F > 0)
{
foreach (var item in backend)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (BE > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
if (BE > 0)
{
foreach (var item in frontend)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
return sum;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
int N = A.Length;
int BE = N - F;
Dictionary<int, int> frontend = new Dictionary<int, int>();
Dictionary<int, int> backend = new Dictionary<int, int>();
Dictionary<int, int> neutral = new Dictionary<int, int>();
for (int i = 0; i < N; i++)
{
if (A[i] > B[i])
{
frontend.Add(i, A[i]-B[i]);
}
else if (B[i] > A[i])
{
backend.Add(i, B[i]-A[i]);
}
else
{
neutral.Add(i, 0);
}
}
bool[] tmp = new bool[N];
int sum = 0;
foreach (var item in frontend.OrderByDescending(x => x.Value))
{
if (F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = true;
F--;
}
}
foreach (var item in backend.OrderByDescending(x => x.Value))
{
if (BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = true;
BE--;
}
}
if (F > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (F > 0)
{
foreach (var item in backend)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (BE > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
if (BE > 0)
{
foreach (var item in frontend)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
return sum;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
// you can also use other imports, for example:
// using System.Collections.Generic;
// you can write to stdout for debugging purposes, e.g.
// Console.WriteLine("this is a debug message");
class Solution {
public int solution(int[] A, int[] B, int F) {
// write your code in C# 6.0 with .NET 4.5 (Mono)
int N = A.Length;
int BE = N - F;
Dictionary<int, int> frontend = new Dictionary<int, int>();
Dictionary<int, int> backend = new Dictionary<int, int>();
Dictionary<int, int> neutral = new Dictionary<int, int>();
for (int i = 0; i < N; i++)
{
if (A[i] > B[i])
{
frontend.Add(i, A[i]-B[i]);
}
else if (B[i] > A[i])
{
backend.Add(i, B[i]-A[i]);
}
else
{
neutral.Add(i, 0);
}
}
bool[] tmp = new bool[N];
int sum = 0;
foreach (var item in frontend.OrderByDescending(x => x.Value))
{
if (F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = true;
F--;
}
}
foreach (var item in backend.OrderByDescending(x => x.Value))
{
if (BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = true;
BE--;
}
}
if (F > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (F > 0)
{
foreach (var item in backend)
{
if (tmp[item.Key] == false && F > 0)
{
sum = sum + A[item.Key];
tmp[item.Key] = false;
F--;
}
}
}
if (BE > 0)
{
foreach (var item in neutral)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
if (BE > 0)
{
foreach (var item in frontend)
{
if (tmp[item.Key] == false && BE > 0)
{
sum = sum + B[item.Key];
tmp[item.Key] = false;
BE--;
}
}
}
return sum;
}
}
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].