应用情景是这样的:假设一个学校要组织学生参加一个活动,学生自己可以决定是否参与该活动,所有参与者将被随机分配一个异性学生做搭档,要求根据全体学生的数据来算出一个分配名单列表。(由于男女数量可能不同,允许有剩余)学生类
属性:int 学号,string 姓名,bool 性别,bool 是否参加活动活动名单类
属性:int 学号1,int 学号2现在假设拥有一个学生对象的集合:List<学生> 学生列表要求根据学生列表进行随机配对,将结果存储到活动名单对象中,装入活动名单对象集合:List<活动名单> 活动名单表如果你不擅长用List<>的话,使用数组也是可以的,主要是算法,一定要求高效。在此先谢谢大家了!另外顺便问一下,对于这种情况的应用算法,有没有什么学名及技术资料呢?
PS:我分不多了,只能节省着给了~~“(0--85) ”×_×咋挣分涅~?~

解决方案 »

  1.   

    先把男女学生分别放在2个List<学生>列表A,B中,然后根据数量少的列表(假设A)按顺序提取学生对象,在数量多的学生列表(假设B)中用随机数提取一个学生对象作为配对,提取完后将此学生对象从列表B中删除,随机数的范围就是B的大小.
    这个是我的思路,我没验证,应该不会超过3秒吧.//假设all为存放所有学生的类
    List<学生> man=new List<学生>();//存放男学生类
    List<学生> woman=new List<学生>();//存放女学生类
    List<学生> temp1=null;
    List<学生> temp2=null;List<学生清单> listStudent=new List<学生清单>();
    学生清单 stduentList=null;System.Random random=new System.Random();foreach(学生 st in all){
      if(st.参加){
        if(st.性别){//男学生
          man.add(st);
        }
        else{
          woman.add(st);
        }
      }
    }if(man.Length<woman.Length){
      temp1=man;
      temp2=woman;
    }
    else
    {
      temp1=woman;
      temp2=man;
    }int index=0;for(学生 stduent in temp1)
    {
      studentList=new 学生清单();
      index=random.next(temp2.Length);//根据temp2的长度获得随机索引
      studentList.学号1=student.学号;
      studentList.学号2=temp2[index].学号;
      listStudent.Add(studentList);
      temp2.RemoveAt(index);//从List中删除已经配对的学生
    }foreach(学生清单 sl in listStudent)
    {
      System.Console.WriteLine(sl.ToString());
    }
      

  2.   

    谢谢二位作答,calen() 的思路中,不进行随机我感觉不妥,因为可能会有拉帮结伙一块报名的情况,而且一般的活动基本都是要参加的,而只有少数有特殊情况的提前声明不参加,也就是说基本上没有报名,只有缺席,这样一班的很容易挤在一起。
    intotheland() 应该是一个比较好的思路,万条运算的话应当不足1秒,我回头测试一下,谢谢你。