// http://codeforces.com/problemset/problem/779/C
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Program {
static void Main() {
var input = Enumerable.Range(0, 3).Select(i => Console.ReadLine());
var cs = Case.Parse(input);
Console.WriteLine(cs);
Console.WriteLine("Result: {0}", cs.Solve());
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public static class LinqEx
{
public static IEnumerable<KeyValuePair<int, T>> Enumerate<T>(this IEnumerable<T> sequence)
{
int index = 0;
foreach (var item in sequence)
{
yield return new KeyValuePair<int, T>(index++, item);
}
}
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> sequence, params Func<T, bool>[] predicates)
{
foreach (var p in predicates)
{
var current = sequence.Where(p);
sequence = sequence.Except(current);
yield return current;
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Price
{
public int Discount { get; set; }
public int Normal { get; set; }
public Price(int discount, int normal)
{
Discount = discount;
Normal = normal;
}
public override string ToString()
{
return $"{nameof(Discount)} = {Discount}; {nameof(Normal)} = {Normal}";
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Case
{
public int N { get; set; }
public int K { get; set; }
public Price[] Prices { get; set; }
public static Case Parse(IEnumerable<string> lines)
{
var result = new Case();
var arr = lines.ToArray();
var items = arr[0].Split(' ').Select(int.Parse).ToArray();
result.N = items[0];
result.K = items[1];
var i1 = arr[1].Split(' ').Select(int.Parse);
var i2 = arr[2].Split(' ').Select(int.Parse);
result.Prices = i1.Zip(i2, (d, n) => new Price(d, n)).ToArray();
return result;
}
public int Solve()
{
var result = new List<int>();
var need = N;
var groups = Prices
.OrderBy(p => p.Discount)
.Split(
p => p.Discount < p.Normal,
p => p.Discount == p.Normal,
p => p.Discount > p.Normal
);
foreach (var pair in groups.Enumerate())
{
if (result.Count >= N)
break;
switch (pair.Key)
{
case 0: {
result.AddRange(pair.Value.Take(need).Select(p => p.Discount));
need -= result.Count;
} break;
case 1: {
var items = pair.Value.Take(need).Select(p => p.Discount).ToArray();
if (items.Length > 0) {
result.AddRange(items);
need -= items.Length;
}
} break;
case 2: {
var group = pair.Value.OrderBy(p => p.Discount - p.Normal);
if (result.Count < K) {
var items = group.Take(K - result.Count);
result.AddRange(items.Select(p => p.Discount));
result.AddRange(group.Except(items).Select(p => p.Normal));
}
else {
result.AddRange(group.Take(need).Select(p => p.Normal));
}
} break;
}
}
return result.Sum();
}
public override string ToString()
{
var pricesStr = Prices != null ? string.Join("\n", Prices.AsEnumerable()) : "";
return $"{nameof(N)} = {N}; {nameof(K)} = {K}\n{pricesStr}";
}
}