E Education
这个题有点意思,就是找满足条件的最小价格里的最大值的人数,有点贪心的思想吧,一开始写错了,人群的那个不能排序,而且是最小价格里找能住下人最多的部门,让这个部门去住这个房间。在循环的时候处理一下,找出来符合条件的人群的最大数就可以了。代码写的巨丑。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<set> 7 #include<algorithm> 8 #include<map> 9 using namespace std; 10 const int INF=0x3f3f3f3f; 11 struct node{ 12 int n; 13 int m; 14 int pos; 15 int flag; 16 }a[100000]; 17 bool cmp(node a,node b){ 18 return a.m<b.m; 19 } 20 int s[100000]; 21 int ans[100000]; 22 int flagg[100000]; 23 int main(){ 24 int d,b; 25 while(~scanf("%d%d",&d,&b)){ 26 memset(flagg,0,sizeof(flagg)); 27 for(int i=0;i<d;i++){ 28 scanf("%d",&s[i]); 29 flagg[i]=1; 30 } 31 for(int i=0;i<b;i++){ 32 a[i].pos=i+1; 33 a[i].flag=1; 34 } 35 for(int i=0;i<b;i++) 36 scanf("%d",&a[i].n); 37 for(int i=0;i<b;i++) 38 scanf("%d",&a[i].m); 39 sort(a,a+b,cmp); 40 int h=0; 41 for(int j=0;j<b;j++){ 42 int maxx=-INF;int situ=-1;int ret=-1; 43 for(int i=0;i<d;i++){ 44 if(a[j].n>=s[i]&&a[j].flag==1&&flagg[i]==1){ 45 if(maxx<s[i]){ 46 maxx=s[i]; 47 ret=i; 48 situ=j; 49 } 50 } 51 } 52 if(ret!=-1){ 53 ans[ret]=a[situ].pos; 54 a[situ].flag=0; 55 flagg[ret]=0; 56 h++; 57 } 58 } 59 if(h<d)printf("impossible\n"); 60 else{ 61 for(int i=0;i<d;i++){ 62 printf("%d",ans[i]); 63 if(i!=d-1)printf(" "); 64 else printf("\n"); 65 } 66 } 67 } 68 return 0; 69 }