//终于A了,不难却觉着坑多的的题,注意-1的处理,感觉我是受memset置0的束缚了,可以把初试成绩置-1.就不用debug怎么久,注意对于-1的处理,不然漏洞百出
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=10001;
struct node
{
int id;
int r;
int submitted;
int s[6];
int sub[6];
int perfect;
};
int per[6];
node list[maxn];
vector<node>ans;
bool cmp(node a,node b)
{
if(a.s[0]!=b.s[0])return a.s[0]>b.s[0];
else if(a.perfect!=b.perfect)return a.perfect>b.perfect;
else return a.id<b.id;
}
int main()
{
freopen("input.txt","r",stdin);
int i,j,n,k,m;
memset(per,0,sizeof(per));
memset(list,0,sizeof(list));
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
for(i=1;i<=k;i++)scanf("%d",&per[i]);
int uid,pid,s;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&uid,&pid,&s);
list[uid].id=uid;
list[uid].sub[pid]++;
if(s==-1&&list[uid].s[pid]==0) list[uid].s[pid]=-1;
else if(list[uid].s[pid]<s)list[uid].s[pid]=s;
}
for(i=0;i<maxn;i++)
{
for(j=1;j<=k;j++)
{
//if(list[i].s[j]==-1)continue;
if(list[i].s[j]>0)list[i].s[0]+=list[i].s[j];
if(list[i].sub[j]>0&&list[i].s[j]!=-1)list[i].submitted=1;
if(list[i].s[j]==per[j])list[i].perfect++;
}
if(list[i].submitted&&list[i].s[0]>=0)ans.push_back(list[i]);
}
sort(ans.begin(),ans.end(),cmp);
for(i=0;i<ans.size();i++)
{
if(i!=0&&ans[i].s[0]==ans[i-1].s[0])ans[i].r=ans[i-1].r;
else ans[i].r=i+1;
}
for(i=0;i<ans.size();i++)
{
printf("%d %05d %d",ans[i].r,ans[i].id,ans[i].s[0]);
for(j=1;j<=k;j++)
{
if(ans[i].s[j]>0)printf(" %d",ans[i].s[j]);
else if(ans[i].sub[j]>0)printf(" 0");
else printf(" -");
}
printf("\n");
}
}
return 0;
}
原文:http://www.cnblogs.com/zeroArn/p/5247442.html