您的位置:首页 > 其它

PAT (Advanced Level) 1075. PAT Judge (25)

2016-07-02 10:33 393 查看
简单模拟题。

注意一点:如果一个人所有提交的代码都没编译通过,那么这个人不计排名。

如果一个人提交过的代码中有编译不通过的,也有通过的,那么那份编译不通过的记为0分。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;

const int maxn=10000+10;
int n,k,m;
int val[10];

struct X
{
int Rank;
int num;
int id;
int tot;
int get[10];
}s[maxn],ans[maxn];
int sz;

bool cmp(const X&a,const X&b)
{
if(a.tot==b.tot&&a.num==b.num) return a.id<b.id;
if(a.tot==b.tot) return a.num>b.num;
return a.tot>b.tot;
}

int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++) scanf("%d",&val[i]);
for(int i=1;i<=n;i++)
{
s[i].id=i;
s[i].num=0;
s[i].tot=0;
for(int j=1;j<=k;j++) s[i].get[j]=-2;
}

for(int i=1;i<=m;i++)
{
int id,pro,get;
scanf("%d%d%d",&id,&pro,&get);
s[id].get[pro]=max(s[id].get[pro],get);
}

sz=0;
for(int i=1;i<=n;i++)
{
int fail=1;
for(int j=1;j<=k;j++)
if(s[i].get[j]>=0) fail=0;
if(fail==1) continue;
ans[sz++]=s[i];
}

for(int i=0;i<sz;i++)
for(int j=1;j<=k;j++)
if(ans[i].get[j]==-1) ans[i].get[j]=0;

for(int i=0;i<sz;i++)
{
for(int j=1;j<=k;j++)
{
if(ans[i].get[j]==-2) continue;
ans[i].tot=ans[i].tot+ans[i].get[j];
if(ans[i].get[j]==val[j]) ans[i].num++;
}
}

sort(ans,ans+sz,cmp);

ans[0].Rank=1;
for(int i=1;i<sz;i++)
{
if(ans[i].tot==ans[i-1].tot)
ans[i].Rank=ans[i-1].Rank;
else ans[i].Rank=i+1;
}

for(int i=0;i<sz;i++)
{
printf("%d %05d %d",ans[i].Rank,ans[i].id,ans[i].tot);
for(int j=1;j<=k;j++)
{
printf(" ");
if(ans[i].get[j]==-2) printf("-");
else printf("%d",ans[i].get[j]);
}
printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: