首页 > ACM题库 > 九度OJ > 九度-1419-文献排序[解题代码]
2013
12-13

九度-1419-文献排序[解题代码]

题目描述:

现在你的导师给你了一个待排序的参考文献列表,要你排好序给他。

文献列表中每一条文献记录只占一行。排序的规则和string类型字符串的比较规则一致(在排序时如果该字符串中包含大写字母,则当作小写字母处理,保证没有相同大小的字符串,但是输出结果不能改变任一字符串),按升序排列。

输入:

输入包括多组,每组输入第一行包括一个整数n,(1<=n<=200),接下来有n行,每行包括一行文献记录,文献记录的长度s(1<=s<=200)。

输出:

        对每组输入。输出排好序的文献记录。

样例输入:
3
abc hello!
Abc hellz!
bbc hello!
样例输出:
abc hello!
Abc hellz!
bbc hello!

cpp 代码如下:
/*
 * JD1419.cpp
 *
 *  Created on: 2012-9-25
 *      Author: Administrator
 */

#include <iostream>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int n;
string strArr[201];

bool mycmp(const string str1,const string str2){
	string tmp1(str1);
	string tmp2(str2);
	for(size_t i=0; i<tmp1.size(); i++){
		if(tmp1[i] >= 'A' && tmp1[i]<='Z')
			tmp1[i] += 32;
	}
	for(size_t i=0; i<tmp2.size(); i++){
			if(tmp2[i] >= 'A' && tmp2[i]<='Z')
				tmp2[i] += 32;
	}

	return tmp1 < tmp2;
}

int main(){
	//cout << "test";
	//cin >> n;
	while(cin >> n){
		getchar();
		for(int i=0; i<n; i++){
			//string * strArr = new string[n];
		char * temp = new char[202];
			cin.getline(temp, 202);
			//getchar();
			strArr[i] = temp;
			//transform(strArr[i].begin(), strArr[i].end(), strArr[i].begin(), toupper);
			//cout << strArr[i];
		}
		sort(strArr, strArr+n, mycmp);
		for(int i=0; i<n; i++)
			cout << strArr[i] << endl;
	}


	return 0;
}



/**************************************************************
	Problem: 1419
	User: coder
	Language: C++
	Result: Accepted
	Time:280 ms
	Memory:1784 kb
****************************************************************/

java 代码如下:

import java.io.BufferedInputStream;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	
	static int n;
	static S[] arr;
	public static void main(String[] args) {

		Scanner s = new Scanner(new BufferedInputStream(System.in));
		//PrintWriter out = new PrintWriter(System.out);
		while(s.hasNextLine()){
			n = Integer.parseInt(s.nextLine());
			arr = new S[n];
			for(int i=0; i<n; i++){
				arr[i] = new S(s.nextLine());
			}
			Arrays.sort(arr);
			for(S str:arr)
				System.out.println(str.str);
		}
	}

}

class S implements Comparable<S>{
	String str;
	
	public S(String s){
		this.str = s;
	}

	public int compareTo(S o) {
		return str.compareToIgnoreCase(o.str);
	}
}

/**************************************************************
	Problem: 1419
	User: coder
	Language: Java
	Result: Accepted
	Time:2530 ms
	Memory:24260 kb
****************************************************************/


  1. 这道题目的核心一句话是:取还是不取。
    如果当前取,则index+1作为参数。如果当前不取,则任用index作为参数。

  2. “再把所有不和该节点相邻的节点着相同的颜色”,程序中没有进行不和该节点相邻的其他节点是否相邻进行判断。再说求出来的也不一样是颜色数最少的

  3. 代码是给出了,但是解析的也太不清晰了吧!如 13 abejkcfghid jkebfghicda
    第一步拆分为 三部分 (bejk, cfghi, d) * C(13,3),为什么要这样拆分,原则是什么?