九度OJ--题目1005:Graduate Admission

1. 题目源地址:http://ac.jobdu.com/problem.php?pid=1005

2. 主要参考博客:http://blog.csdn.net/sjf0115/article/details/8618157

3. 源代码:

//题目1005:Graduate Admission
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;

struct Application
{
   int GE;
   int GI;
   int GF;//最终成绩 
   int PS[6];//报考学习 
   int ID;//申请编号 
}app[40010];

struct School
{
   int quota;//限制名额 
   int count;//实际招收人数
   int AppID[4001];//招收的学生ID 
}school[110];

//排序函数
int cmp(Application a,Application b)
{
    if(a.GF != b.GF)
       return a.GF > b.GF;
    else if(a.GE != b.GE)
       return a.GE > b.GE;
} 

int cmp2(const void *a,const void *b)
{
    return *(int *)a - *(int *)b;
}

int main()
{
    int N,M,K;//N;总申请数   M:学校数   K:报考学校数 
    int SID;//编号 
    int i,j;
    
    while(cin>>N>>M>>K)
    {
       for(i=0;i<M;i++)//输入每个学校的限制名额数 
       {
          cin>>school[i].quota;
          school[i].count=0;
       }
          
       for(i=0;i<N;i++)//输入每份申请的相关信息 
       {
          cin>>app[i].GE>>app[i].GI;//输出GE和GI成绩 
          app[i].GF=(app[i].GE+app[i].GI)/2;//算出最终成绩GF 
          
          for(j=0;j<K;j++)//输入填报的各个志愿学校 
             cin>>app[i].PS[j];
             
          app[i].ID=i;//给每个申请志愿编号 
       }
       
       sort(app,app+N,cmp);//排序
       
       //安排招生
       for(i=0;i<N;i++)
       {
          for(j=0;j<K;j++)
          {
             SID=app[i].PS[j];//取出学生报考的学校编号 
             
             if(school[SID].quota>0)//如果SID学校还没招满
             {
                school[SID].AppID[school[SID].count]=i;
                school[SID].count++;
                school[SID].quota--;
                break;
             } 
             //已经招满
             else
             {
                 int index=school[SID].AppID[school[SID].count-1];//最后一个招生人的ID  
                 //如果所有成绩都一样,即使学校已经招满一样被录取
                 if(app[i].GF == app[index].GF && app[i].GE == app[index].GE)
                 {  
                    school[SID].AppID[school[SID].count] = i;  
                    school[SID].count ++;  
                    school[SID].quota --;  
                    break;   
                 } 
             }
          } //for 
     } //for
          
      for(i = 0;i < M;i++)
      {  
        for(j = 0;j < school[i].count;j++)  
            school[i].AppID[j] = app[school[i].AppID[j]].ID;  
      }  
    //输出学校招收情况  
    for(i = 0;i < M;i++)
    {  
        //该学校没有招收到学生  
        if(school[i].count == 0) 
            printf("\n");  
        
        //该学校招收到1名学生  
        else if(school[i].count == 1)  
            printf("%d\n",school[i].AppID[0]);  

        //该学校招收到大于1名学生,需排序安编号大小输出  
        else
        {  
            //排序输出  
            qsort(school[i].AppID,school[i].count,sizeof(int),cmp2);  
            int first = 1;  
            for(j = 0;j < school[i].count;j++)
            {  
                if(first)
                    first = 0;  
                
                else
                    printf(" ");  
                
                printf("%d",school[i].AppID[j]);  
            }  
            printf("\n");  
        }  
    }//for  
   }
   return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值