此题要注意的点包括排序函数和排名不要定义错,以及同等排名下的录取规则。
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int ge;
int gi;
int gf;
int p[105];
int rk;
int nb;
};
int com(node a,node b)
{
if(a.gf!=b.gf)
return a.gf>b.gf;
return a.ge>b.ge;
}
node arr[40005];
int sz[105];
vector<int> vi[105];
int main()
{
int n,m,k,i,j;
scanf("%d %d %d",&n,&m,&k);
for(i=0;i<m;i++)
scanf("%d",&sz[i]);
for(i=0;i<n;i++)
{
scanf("%d %d",&arr[i].ge,&arr[i].gi);
arr[i].gf=arr[i].ge+arr[i].gi;
arr[i].nb=i;
for(j=0;j<k;j++)
{
scanf("%d",&arr[i].p[j]);
}
}
sort(arr,arr+n,com);
arr[0].rk=1;
for(i=1,j=1;i<n;i++)
{
if(arr[i].gf==arr[i-1].gf&&arr[i].ge==arr[i-1].ge)
arr[i].rk=j;
else
{
arr[i].rk=i+1;
j=i+1;
}
}
int en=0,sch;
for(i=0;i<n;i++)
{
if(i&&arr[i].rk==arr[i-1].rk)
en=1;
else
en=0;
for(j=0;j<k;j++)
{
if(sz[arr[i].p[j]]>0||(en&&sz[arr[i].p[j]]<=0&&sch==arr[i].p[j]))
{
sch=arr[i].p[j];
sz[sch]--;
vi[sch].push_back(arr[i].nb);
break;
}
}
}
for(i=0;i<m;i++)
sort(vi[i].begin(),vi[i].end());
for(i=0;i<m;i++)
{
if(vi[i].empty())
printf("\n");
else
{
for(j=0;j<vi[i].size();j++)
{
if(j) printf(" ");
printf("%d",vi[i][j]);
}
printf("\n");
}
}
return 0;
}
1881

被折叠的 条评论
为什么被折叠?



