Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace SetCover
- {
- class Program
- {
- static void Main(string[] args)
- {
- HashSet<int> universe = Console.ReadLine().Split(", ").Select(e => int.Parse(e)).ToHashSet();
- List<HashSet<int>> sets = new List<HashSet<int>>();
- while (true)
- {
- string input = Console.ReadLine();
- if (string.IsNullOrEmpty(input))
- {
- break;
- }
- HashSet<int> set = new HashSet<int>(input.Split(", ").Select(e => int.Parse(e)));
- sets.Add(set);
- }
- HashSet<int> maxSet = sets.OrderByDescending(s => s.Count).FirstOrDefault();
- //HashSet<int> targetUniverse = new HashSet<int>();
- List<HashSet<int>> resultSets = new List<HashSet<int>>();
- resultSets.Add(maxSet);
- sets.RemoveAt(0);
- if (!universe.SequenceEqual(resultSets[0]))
- {
- while (sets.Count > 0)
- {
- HashSet<int> targetUniverse = resultSets.SelectMany(s => s).ToHashSet();
- HashSet<int> greedySet = GetGreedySet(targetUniverse, sets);
- if (!greedySet.All(e => resultSets.SelectMany(s => s).Contains(e)))
- {
- resultSets.Add(greedySet);
- int[] current = resultSets.SelectMany(s => s).Distinct().OrderBy(i => i).ToArray();
- if (universe.SequenceEqual(current))
- {
- break;
- }
- }
- sets.Remove(greedySet);
- }
- int[] resultSet = resultSets.SelectMany(s => s).Distinct().OrderBy(i => i).ToArray();
- if (!universe.SequenceEqual(resultSet))
- {
- Console.WriteLine("Error");
- return;
- }
- }
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.AppendLine($"Sets to take ({resultSets.Count}):");
- foreach (HashSet<int> set in resultSets)
- {
- stringBuilder.AppendLine(string.Join(", ", set));
- }
- Console.WriteLine(stringBuilder.ToString().TrimEnd());
- }
- private static HashSet<int> GetGreedySet(HashSet<int> universe, List<HashSet<int>> sets)
- {
- HashSet<int> greedySet = sets[0];
- sets.RemoveAt(0);
- foreach (HashSet<int> set in sets)
- {
- HashSet<int> current = new HashSet<int>(set);
- current.ExceptWith(universe);
- if (current.Count > greedySet.Count)
- {
- greedySet = set;
- }
- }
- return greedySet;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement