Task 779C

Run Settings
LanguageC#
Language Version
Run Command
// 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}"; } }
Editor Settings
Theme
Key bindings
Full width
Lines