题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=171
解题报告:
1、按照体重排序
2、成绩过了分数线,就加入
3、剩下没有安排的人,加入到各个区域,确保各个区域招满
#include <cstdio> #include <algorithm> #include <cstring> 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<b.index; } int main() { int n,k; while(scanf("%d",&k)!=EOF) { memset(stu,0,sizeof(stu)); n=0; for(int i=1;i<=k;i++) { scanf("%d",&zone[i].num); zone[i].index=i; n+=zone[i].num; } for(int i=1;i<=k;i++) { scanf("%d",&zone[i].level); } sort(zone+1,zone+k+1,cmp1); for(int i=1;i<=n;i++) { scanf("%d",&stu[i].score); stu[i].index=i; } for(int i=1;i<=n;i++) { scanf("%d",&stu[i].w); } sort(stu+1,stu+n+1,cmp2); for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { if(stu[i].score>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(" "); } return 0; }