复习了一些基本知识,包括vector的使用和迭代器的使用,两关键字排序,尤其是vector的排序,挺有趣的,直接sort(v.begin(),v.end())就行。
有一个困扰很久的bug是结构体中定义的变量不能在直接赋初值,否则本地运行没问题,提交就CE。
//九度oj1005
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <vector>
#define ll long long
#define maxn 2000005
#define INF 0x3f3f3f3f
using namespace std;
int q[105];
int ok[105];
struct stu
{
int id;
int ge,gl;
int fg;
int eq;
int zy[10];
};
stu s[40005];
bool cmp(const stu a,const stu b)
{
if(a.fg==b.fg) return a.ge>b.ge;
return a.fg>b.fg;
}
int main()
{
int n,m,t;
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
vector<int>ans[105];
memset(ok,0,sizeof(ok));
for(int i=0;i<m;i++)
cin>>q[i];
for(int i=0;i<n;i++)
{
s[i].id=i;
cin>>s[i].ge>>s[i].gl;
for(int j=0;j<t;j++)
cin>>s[i].zy[j];
s[i].fg=(s[i].ge+s[i].gl)/2;
s[i].eq=0;
}
sort(s,s+n,cmp);
for(int i=1;i<n;i++)
{
if(s[i].fg==s[i-1].fg&&s[i].ge==s[i-1].ge)
{
s[i].eq=1;
}
//cout<<s[i].id<<endl;
}
for(int i=0;i<n;i++)
{
if(s[i].eq==0) memset(ok,0,sizeof(ok));
for(int j=0;j<t;j++)
{
int ch=s[i].zy[j];
if(q[ch]>0)
{
q[ch]--;
ans[ch].push_back(s[i].id);
if(q[ch]==0) ok[ch]=1;
break;
}
else if(s[i].eq&&ok[ch])
{
ans[ch].push_back(s[i].id);
break;
}
}
}
for(int i=0;i<m;i++)
{
sort(ans[i].begin(),ans[i].end());
vector<int> :: iterator it;
if(ans[i].empty()){
cout<<endl;
continue;
}
it=ans[i].begin();
cout<<*it;
it++;
while(it!=ans[i].end())
{
cout<<" "<<*it;
it++;
}
cout<<endl;
}
}
return 0;
}