題目
衆所周知,IOIForum有很多水王,他們的發貼數是如此之多,以至於必須要用高精度數才能保存。 爲了迎接國慶,IOIForum決定舉行一次水王爭霸賽,比賽的規則是將這些水王截止到2003年9月30日23時59分59秒這一刻所發的總貼數從大到小進行排序。每個水王當然都想取得儘量靠前的名次,所以他們竭盡全力,不擇手段地進行灌水。 終於,激動人心的一刻到來了,2003年10月1日0時0分0秒,你作爲裁判得到了每個水王的發貼數,現在,你的任務是公正地把這些水王按照發貼數從大到小進行排序。
輸入
輸入的第一行是一個1到1000的整數N,表示總共有N位水王參加了爭霸賽。 以下依次給出每位水王的描述,一位水王的描述佔據兩行,第一行爲一個僅由字母和數字組成的長度不超過20的字符串,代表這個水王的ID,第二行一個高精度的整數(非負數),代表這個水王的發貼數。注意,這個整數的首位沒有不必要的0。 考慮到IOIForum的數據庫是有限的,所有水王發貼數的總長度(注意,是總長度而不是總和)不會超過10000。 除了子母、數字和必要的換行,輸入中不會出現空格等字符。
輸出
依次輸出按照發貼數從大到小排好序的各位水王的ID,每個ID佔據單獨的一行。不能有任何多餘的字符。若幾個ID的發貼數相同,則按照ID的字典順序先後排列。
樣例輸入
6
lowai
1534534124561243453
zhouyuan
23453265344
Maolaoda
23442353452342
BuTaoCaiGuai
7568784573464
ArthurKing
97534892734723947
hyyylr
623893451
樣例輸出
lowai
ArthurKing
Maolaoda
BuTaoCaiGuai
zhouyuan
hyyylr
源代碼
#include <stdio.h>
#include <string.h>
struct shuiwang
{
char name[20];
char num[10000];
}a[1000];
int main()
{
int i, n, j, len[1000], t, k, b[1000], e, c, d;
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%s", a[i].name);
getchar();
scanf("%s", a[i].num);
getchar();
len[i] = strlen(a[i].num);
b[i] = i;
}
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if(len[j] > len[i])
{
t = len[i];
len[i] = len[j];
len[j] = t;
k = b[i];
b[i] = b[j];
b[j] = k;
}
else if(len[i] == len[j])
{
c = b[i];
d = b[j];
if(strcmp(a[c].num,a[d].num) < 0)
{
k = b[i];
b[i] = b[j];
b[j] = k;
}
else if(strcmp(a[c].num,a[d].num) == 0)
{
if(strcmp(a[c].name,a[d].name) > 0)
{
k = b[i];
b[i] = b[j];
b[j] = k;
}
}
}
}
}
for(i=0; i<n; i++)
{
e = b[i];
printf("%s\n", a[e].name);
}
return 0;
}