2 5 2 3
40 200
1000 199 201 10 50
600 300 400 200 800
3 5 5 3 1
10 20 30
30 25 20 15 10
30 25 20 15 10
1 1 impossible
20
10
1
2:有两个队伍 5:有五个房子
下面两个数为队伍的人数
应该先把队伍对的人先处理了 (因为如果你先处理队伍少的 因为是先按照钱排的顺序所以可能你一个便宜而且存人多的只存了一个人少的队伍 导致后面人多的队伍没地方放了 )
#include <iostream>#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct p
{
int a;
int b;
int c=0;
int d;
} x[6000],c[6000];
int cmp1(struct p a,struct p b)
{
if(a.b!=b.b)
return a.b<b.b;
else
return a.a<b.a;
}
int cmp2(struct p a,struct p b)
{
if(a.a!=b.a)
return a.a>b.a;
}
int cmp3(struct p a,struct p b)
{
if(a.b!=b.b)
return a.b<b.b;
}
int main()
{
int a,b,i,j,ge;
while(~scanf("%d%d",&a,&b))
{
memset(x,0,sizeof(x));
memset(c,0,sizeof(c));
for(i=0; i<=a-1; i++)
scanf("%d",&c[i].a),c[i].b=i+1;
for(i=0; i<=b-1; i++)
{
scanf("%d",&x[i].a);
x[i].d=i+1;
}
for(i=0; i<=b-1; i++)
scanf("%d",&x[i].b);
sort(x,x+b,cmp1);
sort(c,c+a,cmp2);
ge=0;
for(i=0; i<=a-1; i++)
{
for(j=0; j<=b-1; j++)
if(x[j].a>=c[i].a&&x[j].c==0)
{
x[j].c=1;
ge++;
break;
}
}
for(i=0; i<=b-1; i++)
x[i].c=0;
if(ge==a)
{
for(i=0; i<=a-1; i++)
{
for(j=0; j<=b-1; j++)
if(x[j].a>=c[i].a&&x[j].c==0)
{
x[j].c=1;
break;
}
c[i].d=x[j].d;
}
sort(c,c+a,cmp3);
for(i=0; i<=a-1; i++)
{
if(i<=a-2)
printf("%d ",c[i].d);
else
printf("%d\n",c[i].d);
}
}
else
printf("impossible\n");
}
}