zoukankan      html  css  js  c++  java
  • PAT:1080. Graduate Admission (30) AC

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    struct Student
    {
      int GE,GI,sum,rank,ID;
      int prefer[6];
    }STU[40066];
    
    struct School
    {
      int want;        //各学校招生人数
      int get;        //已招到的人数
      int line;        //最后一名进来的排名线
      int queue[40066];      //已投档学生编号
    }SC[106];
    
    bool cmp(Student a,Student b)
    {
      if(a.sum!=b.sum)
        return a.sum>b.sum;
      else
        return a.GE>b.GE;
    }
    
    int main()
    {
      memset(STU,0,sizeof(STU));
      memset(SC,0,sizeof(SC));
      int n,m,k;              //n名考生,m所学校,k个志愿
      scanf("%d%d%d",&n,&m,&k);
      for(int i=0 ; i<m ; ++i)      //输入各学校招生人数
        scanf("%d",&SC[i].want);
      for(int i=0 ; i<n ; ++i)
      {
        scanf("%d %d",&STU[i].GE, &STU[i].GI);    //填入分数
        STU[i].sum=STU[i].GE+STU[i].GI;        //填入总分
        STU[i].ID=i;                //填入编号
        for(int j=0 ; j<k ; ++j)
        {
          int tmp=-1;
          scanf("%d",&tmp);      //填入志愿
          STU[i].prefer[j]=tmp;
        }
      }
      sort(STU,STU+n,cmp);
      STU[0].rank=1;
      for(int i=1 ; i<n ; ++i)            //填入排序
      {
        if(STU[i].sum==STU[i-1].sum && STU[i].GE==STU[i-1].GE)
          STU[i].rank=STU[i-1].rank;
        else
          STU[i].rank=i+1;
      }
      //学生志愿为导向
      for(int i=0 ; i<n ; ++i)
      {
        for(int j=0 ; j<k ; ++j)      //STU[i].prefer[j]代表考生的j号志愿学校代码
        {
          if(SC[STU[i].prefer[j]].want>SC[STU[i].prefer[j]].get ||  SC[STU[i].prefer[j]].line==STU[i].rank )  //该校未招满或者已招满但考生排名和最后一个找入学生一样
          {
          SC[STU[i].prefer[j]].queue[SC[STU[i].prefer[j]].get]=STU[i].ID;        //考生i的ID入档
            ++SC[STU[i].prefer[j]].get;              //入档学生数+1
            SC[STU[i].prefer[j]].line=STU[i].rank;          //更新最后名次
        break;      //已被录取
          }
        }
      }
      //输出
      for(int i=0 ; i<m ; ++i)
      {
        sort(SC[i].queue,SC[i].queue+SC[i].get);    //最后升序排列
        for(int j=0 ; j<SC[i].get ;++j)
        {
          printf("%d",SC[i].queue[j]);
          if(j!=SC[i].get-1)
            printf(" ");
        }
        printf("
    ");
      }
      return 0;
    }
  • 相关阅读:
    java+opencv实现图像灰度化
    java实现高斯平滑
    hdu 3415 单调队列
    POJ 3368 Frequent values 线段树区间合并
    UVA 11795 Mega Man's Mission 状态DP
    UVA 11552 Fewest Flops DP
    UVA 10534 Wavio Sequence DP LIS
    UVA 1424 uvalive 4256 Salesmen 简单DP
    UVA 1099 uvalive 4794 Sharing Chocolate 状态DP
    UVA 1169uvalive 3983 Robotruck 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/Evence/p/4320566.html
Copyright © 2011-2022 走看看