思路不清晰
memset初始化(数组,初始的数值,sizeof(数组))
排序顺序得是
先排除一个提交都没有的人;
再按总分排列;
再按完美接替数;
再按id;
提交错误的-1 分数实际是0;
可以直接输入uid , pid ,作为数组的下标
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef struct node
{
int uid;
int score[10];
int tscore;
bool flag;
int per;
}record;
record r[100010];
void initia(int n)
{
for(int i=1;i<=n;i++)
{
r[i].uid = i;
r[i].tscore = 0;
r[i].flag = false;
r[i].per = 0;
memset(r[i].score,-1,sizeof(r[i].score));
}
}
bool cmp(record a, record b)
{
if(a.tscore != b.tscore)
return a.tscore > b.tscore;
else if(a.per != b.per)
return a.per>b.per;
else if(a.uid != b.uid)
return a.uid < b.uid;
}
int main()
{
int n,k,m,full[10];
int tu,tp,ts;
scanf("%d %d %d",&n,&k,&m);
for(int i =1;i<=k;i++)
{
scanf("%d",&full[i]);
}
initia(n);
for(int i =0 ;i<m;i++)
{
scanf("%d %d %d",&tu,&tp,&ts);
if(ts!=-1)
{
r[tu].flag = true;
}
if(ts == -1 && r[tu].score[tp] == -1)
{
r[tu].score[tp] = 0;
}
if(ts == full[tp] && r[tu].score[tp]<full[tp])
{
r[tu].per++;
}
if(ts>r[tu].score[tp])
{
r[tu].score[tp] = ts;
}
}
for(int i = 1;i<=n;i++)
{
for(int j =1;j<=k;j++)
{
if(r[i].score[j] != -1)
r[i].tscore += r[i].score[j];
}
}
sort(r+1,r+n+1,cmp);
int rank = 1;
int temp = 0;
for(int i =1 ;i<=m && r[i].flag == true;i++)
{
temp++;
if(i>1 && r[i].tscore != r[i-1].tscore)
{
rank=temp;
}
printf("%d %06d %d",rank,r[i].uid,r[i].tscore);
for(int j = 1;j<=k;j++)
{
if(r[i].score[j] == -1)
printf(" -");
else
printf(" %d",r[i].score[j]);
}
printf("\n");
}
return 0;
}