学校招收学生 优先级按照: 分数 是否本地 志愿先后
相当于 女的开后宫
对gs进行略微修改
结束的条件为每个男的表白完所有女的
第二部分比较时 找出女的后宫里的吸引力最弱的男的比较 然后是否取代
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 200 #define eps 1e-6 using namespace std; struct node { int id,region,score,k; }stu[N]; struct node1 { int region,num; }sch[N]; struct node2 { int cnt; int manname[N]; }woman[N]; int r,n,m; int map1[N][N],map2[N][N],man[N],times[N],vis[N]; int cmp(node a,node b) { if(a.region==r) { if(b.region==r) return a.score>b.score; if(b.region!=r) { if(abs(a.score-0.7*b.score)<eps) return 0; else return a.score>0.7*b.score; } } else if(b.region==r) { if(a.region==r) return a.score>b.score; if(a.region!=r) { if(abs(b.score-0.7*a.score)<eps) return 1; else return b.score<0.7*a.score; } } else return a.score>b.score; } int cmp1(node a,node b) { return a.id<b.id; } void makerank() { int i,j; for(i=1;i<=m;i++) { r=sch[i].region; sort(stu+1,stu+n+1,cmp); for(j=1;j<=n;j++) map2[i][stu[j].id]=j; } sort(stu+1,stu+n+1,cmp1); } void Gale_Shapley() { int flag=1,i,j,worstrank,worstrankj; memset(man,0,sizeof(man)); for(i=1;i<=n;i++) times[i]=1; for(i=1;i<=n;i++) vis[i]=0; for(i=1;i<=m;i++) woman[i].cnt=0; while(flag) { flag=0; for(i=1;i<=n;i++) { while(!man[i]&&!vis[i]) { flag=1; if(times[i]>stu[i].k) { vis[i]=1; break; } int name=map1[i][times[i]]; if(woman[name].cnt<sch[name].num) { woman[name].manname[++woman[name].cnt]=i; man[i]=name; times[i]++; } else if(woman[name].cnt==sch[name].num) { worstrank=0; for(j=1;j<=woman[name].cnt;j++) { if(map2[name][woman[name].manname[j]]>worstrank) { worstrank=map2[name][woman[name].manname[j]]; worstrankj=j; } } if(map2[name][i]<worstrank) { man[woman[name].manname[worstrankj]]=0; woman[name].manname[worstrankj]=i; man[i]=name; times[i]++; } else times[i]++; } } } } } int main() { int T,j,i; scanf("%d",&T); while(T--) { memset(map1,0,sizeof(map1)); memset(map2,0,sizeof(map2)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { stu[i].id=i; scanf("%d%d%d",&stu[i].region,&stu[i].score,&stu[i].k); for(j=1;j<=stu[i].k;j++) { scanf("%d",&map1[i][j]); } } for(i=1;i<=m;i++) { scanf("%d%d",&sch[i].region,&sch[i].num); } makerank(); Gale_Shapley(); for(i=1;i<=n;i++) if(vis[i]) printf("not accepted\n"); else printf("%d\n",man[i]); if(T) printf("\n"); } return 0; }