积极答复者
如何用最少的菜满足大家的口味?

问题
-
有这么个场景,有一帮同事去吃饭,每个同事都写出自己喜欢吃的菜,如何从这些菜单里得到一个最终下锅的菜单呢?
下锅菜单的要求:
1.菜最少
2.满足各同事的口味
3.求算法代码描述:
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class Program { enum Menu : byte { 麻婆豆腐 = 1, 红烧排骨 = 2, 地三鲜 = 3, 干煸四季豆 = 4, 红烧牛肉 = 5 } static void Main(string[] args) { // 场景一 List<Menu> menu1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu2 = new List<Menu>() { Menu.麻婆豆腐, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu3 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menuCook1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.干煸四季豆 }; // 最终,要下锅的菜单有:麻婆豆腐,红烧排骨,干煸四季豆 // 虽然麻婆豆腐,红烧排骨,地三鲜重复了,但只取一个菜就行 // 场景二 List<Menu> menu4 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu5 = new List<Menu>() { Menu.红烧排骨, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu6 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menu7 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜, Menu.干煸四季豆, Menu.红烧牛肉 }; List<Menu> menuCook2 = new List<Menu>() { Menu.红烧排骨 }; // 最终,要下锅的菜单有:红烧排骨,因为四个同事开出的菜单里都有红烧排骨 Console.ReadKey(); } } }
答案
-
Hi,
取group最大的資料,如下,
// 场景一 List<Menu> menu1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu2 = new List<Menu>() { Menu.麻婆豆腐, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu3 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menuCook1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.干煸四季豆 }; var menus = new List<Menu>(); menus.AddRange(menu1); menus.AddRange(menu2); menus.AddRange(menu3); var gmenus = menus.GroupBy(m => m).Select(g => new { groupItem = g.Key, groupCount = g.Count() }); var maxItemCnt = gmenus.Max(g => g.groupCount); //這個是你要的 var topItems = gmenus.Where(g => g.groupCount == maxItemCnt); // 最终,要下锅的菜单有:麻婆豆腐,红烧排骨,干煸四季豆 // 虽然麻婆豆腐,红烧排骨,地三鲜重复了,但只取一个菜就行 // 场景二 List<Menu> menu4 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu5 = new List<Menu>() { Menu.红烧排骨, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu6 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menu7 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜, Menu.干煸四季豆, Menu.红烧牛肉 }; List<Menu> menuCook2 = new List<Menu>() { Menu.红烧排骨 }; // 最终,要下锅的菜单有:红烧排骨,因为四个同事开出的菜单里都有红烧排骨 var menus2 = new List<Menu>(); menus2.AddRange(menu4); menus2.AddRange(menu5); menus2.AddRange(menu6); menus2.AddRange(menu7); var gmenus2 = menus2.GroupBy(m => m).Select(g => new { groupItem = g.Key, groupCount = g.Count() }); var maxItemCnt2 = gmenus2.Max(g => g.groupCount); //這個是你要的 var topItems2 = gmenus2.Where(g => g.groupCount == maxItemCnt2);
- 已标记为答案 Jason Dot WangModerator 2013年5月29日 8:51
全部回复
-
Hi,
取group最大的資料,如下,
// 场景一 List<Menu> menu1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu2 = new List<Menu>() { Menu.麻婆豆腐, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu3 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menuCook1 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.干煸四季豆 }; var menus = new List<Menu>(); menus.AddRange(menu1); menus.AddRange(menu2); menus.AddRange(menu3); var gmenus = menus.GroupBy(m => m).Select(g => new { groupItem = g.Key, groupCount = g.Count() }); var maxItemCnt = gmenus.Max(g => g.groupCount); //這個是你要的 var topItems = gmenus.Where(g => g.groupCount == maxItemCnt); // 最终,要下锅的菜单有:麻婆豆腐,红烧排骨,干煸四季豆 // 虽然麻婆豆腐,红烧排骨,地三鲜重复了,但只取一个菜就行 // 场景二 List<Menu> menu4 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜 }; List<Menu> menu5 = new List<Menu>() { Menu.红烧排骨, Menu.地三鲜, Menu.红烧牛肉 }; List<Menu> menu6 = new List<Menu>() { Menu.红烧排骨, Menu.干煸四季豆 }; List<Menu> menu7 = new List<Menu>() { Menu.麻婆豆腐, Menu.红烧排骨, Menu.地三鲜, Menu.干煸四季豆, Menu.红烧牛肉 }; List<Menu> menuCook2 = new List<Menu>() { Menu.红烧排骨 }; // 最终,要下锅的菜单有:红烧排骨,因为四个同事开出的菜单里都有红烧排骨 var menus2 = new List<Menu>(); menus2.AddRange(menu4); menus2.AddRange(menu5); menus2.AddRange(menu6); menus2.AddRange(menu7); var gmenus2 = menus2.GroupBy(m => m).Select(g => new { groupItem = g.Key, groupCount = g.Count() }); var maxItemCnt2 = gmenus2.Max(g => g.groupCount); //這個是你要的 var topItems2 = gmenus2.Where(g => g.groupCount == maxItemCnt2);
- 已标记为答案 Jason Dot WangModerator 2013年5月29日 8:51