SGU171

来源:互联网 发布:杨振宁地位 知乎 编辑:程序博客网 时间:2024/05/18 01:56
/*题目大意:有k个赛区,第i赛区邀请N[i]个学生,所以总的邀请的人数为N=N[1]+N[2]+...N[k];每个赛区有一个晋级能力值Q[i],每个学生有两个参数,能力值p[i]和重量w[i],只有当一个学生的p>Q 时,那个学生才能在这个赛区晋级,而且要求晋级的人数的总的重量尽量大解法:先将每个赛区的晋级能力值按大到小排,将学生按照w从大到小排,然后w大的优先去选择赛区,看看能在哪个赛区晋级最后剩余的学生都是不能在这k个赛区晋级的,所以随便选择还有空余名额的赛区*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=16000+10;struct point{int w,p;int index,on;}p[maxn];struct NN{int Q,num;int index;}N[105];int cmp1(const NN a,const NN b){return a.Q>b.Q;}int cmp2(const point a,const point b){return a.w>b.w;}int cmp3(const point a,const point b){return a.on<b.on;}int main(){int i,j,k,n;while(scanf("%d",&k)!=EOF){n=0;for(i=1;i<=k;i++){scanf("%d",&N[i].num);n=n+N[i].num;N[i].index=i;}for(i=1;i<=k;i++)scanf("%d",&N[i].Q);for(i=1;i<=n;i++){scanf("%d",&p[i].p);p[i].index=0;p[i].on=i;}for(i=1;i<=n;i++)scanf("%d",&p[i].w);sort(N+1,N+k+1,cmp1);sort(p+1,p+n+1,cmp2);for(i=1;i<=n;i++)for(j=1;j<=k;j++){if(p[i].p>N[j].Q && N[j].num>0){  p[i].index=N[j].index; N[j].num--;break;}}for(i=1;i<=n;i++)if(p[i].index==0)for(j=1;j<=k;j++){if(N[j].num>0) { p[i].index=N[j].index;N[j].num--;break;}}sort(p+1,p+n+1,cmp3);for(i=1;i<=n;i++){printf("%d",p[i].index);if(i!=n) printf(" ");else printf("\n");}}return 0;}