using System.Collections.Generic;
public static void Main(){
var vals = new []{1,2,2,3,3,3,3,4,7,7,7,8,9,10};
Console.WriteLine(GetLongestAmp(vals));
public static int GetLongestAmp(int[] vals)
var counts = GetCounts(vals);
var maxbin = new string(Enumerable.Repeat('1',counts.Count()).ToArray());
return GetBinaryReps(maxbin)
.Select(x => FilteredVals(counts, x))
.Select(x => counts.Where(c => !x.Contains(c.Key)))
.Select(x => new {vals = x , sum = x.Sum(z => z.Count)})
.OrderByDescending(x => x.sum).First(x => x.vals.Select(a => a.Key).ToArray().IsAmp()).sum;
public static int[] FilteredVals(IEnumerable<KeyCount> vals, string switches){
var output = new List<int>();
for(int i = 0; i < switches.Length; i++){
if(switches[i] == '1') output.Add(vals.ElementAt(i).Key);
public static IEnumerable<KeyCount> GetCounts(int[] vals){
return vals.GroupBy(x => x).Select(x => new KeyCount(x.Key,x.Count())).OrderBy(x => x.Count);
public static IEnumerable<string> GetBinaryReps(string max)
var maxcount = Convert.ToInt32(max, 2);
output = Convert.ToString(count,2).PadLeft(max.Length,'0');
}while(output != max && count < maxcount + 1);
public int Key { get; private set; }
public int Count { get; private set; }
public KeyCount(int key, int count) : this(){
public static bool IsAmp(this IEnumerable<int> vals){
return vals.Count() <= 1 || vals.Max() - vals.Min() <= 1;