none
如何用最少的菜满足大家的口味? RRS feed

  • 问题

  • 有这么个场景,有一帮同事去吃饭,每个同事都写出自己喜欢吃的菜,如何从这些菜单里得到一个最终下锅的菜单呢?
    下锅菜单的要求:
    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();
            }
        }
    }

    2013年5月22日 3:41

答案

  • 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);


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月28日 8:08

全部回复

  • 重载了 Menu 的 Equals and GetHasCode 方法,令它们能够比较。。

    然后合并起来,用 Linq 去掉重复项:

    menuCook2.AddRange(menu1);
    menuCook2.AddRange(menu2);
    menuCook2.AddRange(menu3);
    menuCook2.AddRange(menu4);

    IEnumerable<Menu> final= menuCook2.Distinct();


    学习学习....



    • 已编辑 IGabriel 2013年5月28日 3:37
    2013年5月28日 3:36
  • 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);


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月28日 8:08