题目
给定 N 个三元组 (x,y,z其中 x是整数,y是浮点数,z是字符串。
请你按照 x从小到大的顺序将这些三元组打印出来。
数据保证不同三元组的 x值互不相同。
输入格式
第一行包含整数 N。
接下来 N 行,每行包含一个整数 x,一个浮点数 y,一个字符串 z,表示一个三元组,三者之间用空格隔开。
输出格式
共 N 行,按照 x 从小到大的顺序,每行输出一个三元组。
注意,所有输入和输出的浮点数 y 均保留两位小数。
数据范围
1≤N≤10000
1≤x,y≤10^5
字符串总长度不超过10^5。
输入样例:
5 32 1.36 nsyiupnnhc 18 4.53 fmofzwrah 33 4.86 wzuymbm 1 3.93 gtnrwcebt 31 4.53 gcllxioc
输出样例:
1 3.93 gtnrwcebt 18 4.53 fmofzwrah 31 4.53 gcllxioc 32 1.36 nsyiupnnhc 33 4.86 wzuymbm
解法(C++实现):
题目分析:
数据结构角度:
对于任何一个题目,我们都要从算法和数据结构两个角度去思考。本题看到三元组,我们自然要先去思考这个三元组要如何存储。三元组有三个元素分别为int、float、string三种类型,所以它的数据结构形式非常明确——类或者结构体。因为对于cpp和c语言来说,就这两种结构能够一个元素单位去存储多个类型的元素。当然本题中选择结构题或者类都可以。
算法实现角度:
本题的算法实现非常简单,就是实现一个排序算法。至于需要选择什么样的排序算法在这里我们不做考虑,因为我们想直接调用stl的内置sort函数去实现。这里自然会存在问题,那就是sort函数内部的代码实现,是直接用<号去进行排序的,那么当我们把一个结构体输入给sort函数时,它将会对两个结构体进行<号去排序,但是我们知道<并不能用于结构体,所以本题算法实现的关键就在于想到对<符号进行重载,使它能够实现结构体之间的大小比较,并且比较的决定性因素仅仅在于第一个int类型的大小。
代码实现:
#include<iostream> #include<algorithm>//sort函数所在的库 #include<iomanip>//c++用setprecision函数保留小数位的库 using namespace std; const int N=10001; struct tripleClass{ int data; float data2; string data3; bool operator<(const tripleClass& a)const{//第一个const保证右边的结构体不会被改变,输入引用 //在于结构体调用复制构造效率低下,直接引用更快。 //最外面的const保证调用这个<符号的类或者结构体本身在函数中不会被改变 return data<a.data; } }a[N];//在结构体下面直接创建一个数组,其中每个元素都是该结构体 int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i].data>>a[i].data2>>a[i].data3; } sort(a,a+n);//利用迭代器把结构体数组放到sort中进行排序 for(int i=0;i<n;i++){ cout<<fixed<<setprecision(2)<<a[i].data<<" "<<a[i].data2<<" "<<a[i].data3<<endl; } }