题目链接:
解题报告:
1、按照体重排序
2、成绩过了分数线,就加入
3、剩下没有安排的人,加入到各个区域,确保各个区域招满
#include#include #include using namespace std;const int maxZ=110;///最多有110个地区const int maxP=16000+10;///最多有16000+10个学生struct Zone{ int index;///编号 int level;///分数线 int num;///人数}zone[maxZ];struct Student{ int index;///编号 int score;///分数 int w;///体重 int p;///是否存起来}stu[maxP];bool cmp1(Zone a,Zone b){ return a.level>b.level;}bool cmp2(Student a,Student b){ return a.w>b.w;}bool cmp3(Student a,Student b){ return a.index zone[j].level&&zone[j].num>0) { stu[i].p=zone[j].index; zone[j].num--; break; } } } int j = 1; for(int i=1;i<=n;i++) /// 按照体重由大到小随意分配剩下的学生,保证每个学生都有考试区域 { if(stu[i].p!=0) continue; while(zone[j].num == 0) j++; stu[i].p = zone[j].index; zone[j].num--; } sort(stu+1,stu+n+1,cmp3); for(int i = 1; i <= n; i++) { if(i == 1) printf("%d", stu[i].p); else printf(" %d", stu[i].p); } printf("\n"); } return 0;}