解析:
大佬队友的思路
因为这里score字符串限定的很死(1位整数+'.'+很多小数),所以完全可以用strcmp来比较,可以用优先队列/sort()来做
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
const int MAX = 6e5+100;
const int MAXN = 2e5+10;
char ss[MAX+MAXN*2];
int mark0[MAXN];
typedef struct node
{
int name;
int score;
node(int a=0,int b=0):name(a),score(b){}
friend bool operator <(struct node a,struct node b)
{
if(strcmp(ss+mark0[a.score],ss+mark0[b.score])==0) return a.name>b.name;
else return strcmp(ss+mark0[a.score],ss+mark0[b.score])<0;
}
}node;
typedef struct NAME
{
int id;
char na[20];
}NAME;
char str[MAX+MAXN*2];
NAME name[MAXN];
int mark[MAXN];
char temp[MAX];
int cmm;
priority_queue<node> q;
bool cmp(NAME a,NAME b)
{
return strcmp(a.na,b.na)<0;
}
int main()
{
int n;
scanf("%d",&n);
getchar();
int ck=0;
int dw=0;
for(int i=0;i<n;i++)
{
scanf("%s%s",name[i].na,str+ck);
name[i].id=i;
mark[i]=ck;
int len=strlen(str+ck);
strcpy(temp,str+ck);
ck=ck+len+1;
for(int j=len-1;j>=0&&temp[j]=='0';j--)
{
temp[j]='\0';
}
mark0[i]=dw;
strcpy(ss+dw,temp);
len=strlen(temp);
dw=dw+len+1;
}
sort(name,name+n,cmp);
for(int i=0;i<n;i++)
{
q.push(node(i,name[i].id));
}
while(q.size())
{
node tmp=q.top();
q.pop();
int cd=tmp.name;
printf("%s %s\n",name[cd].na,str+mark[tmp.score]);
}
return 0;
}