天天看點

HDU 1862 EXCEL排序EXCEL排序

EXCEL排序

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 14031    Accepted Submission(s): 5442

Problem Description Excel可以對一組紀錄按任意指定列排序。現請你編寫程式實作類似功能。  

Input 測試輸入包含若幹測試用例。每個測試用例的第1行包含兩個整數 N (<=100000) 和 C,其中 N 是紀錄的條數,C 是指定排序的列号。以下有 N

行,每行包含一條學生紀錄。每條學生紀錄由學号(6位數字,同組測試中沒有重複的學号)、姓名(不超過8位且不包含空格的字元串)、成績(閉區間[0, 100]内的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。

Output 對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編号(從1開始)。随後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學号遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3

時,按成績的非遞減排序。當若幹學生具有相同姓名或者相同成績時,則按他們的學号遞增排序。

Sample Input

3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
        

Sample Output

Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
        

Source 浙大計算機研究所學生複試上機考試-2007年

一個結構體排序。

感覺題意有點不清。

第二個案例中,姓名等的話為什麼不是按成績降序排呢?

算了。

其實三個排序。

第一個:學号升序排。

第二個:名字不同,學号升序,否則按字典序在前的排。

第三個:分數等,學号升序,否則分數升序

全程沒有降序的排列。

上代碼

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node
{
	int score;
	char name[15];
	char xuehao[15];
}
;
node f[100005];
bool cmp(node a,node b)
{
	return strcmp(a.xuehao,b.xuehao)<0;
}
bool cmp1(node a,node b)
{
	if(strcmp(a.name,b.name)!=0)
		return strcmp(a.name,b.name)<0;
	else
		return  strcmp(a.xuehao,b.xuehao)<0;
}
bool cmp2(node a,node b)
{
	if(a.score==b.score)
		return strcmp(a.xuehao,b.xuehao)<0;
	else
		return a.score<b.score;
}
int main()
{
	int n,c,i,j,cc;
	cc=0;
	while(scanf("%d%d",&n,&c)!=EOF&&c!=0&&n!=0)
	{
        for(i=0;i<n;i++)
			scanf("%s%s%d",f[i].xuehao,f[i].name,&f[i].score);
        if(c==1)
			sort(f,f+n,cmp);
		else if(c==2)
			sort(f,f+n,cmp1);
		else 
			sort(f,f+n,cmp2);
		printf("Case %d:\n",++cc);
		for(i=0;i<n;i++)
			printf("%s %s %d\n",f[i].xuehao,f[i].name,f[i].score);
	}
	return 0;
}