c++中sort函数的应用-HDOJ2093

betball贝博app C++, HDOJ 458 次浏览 没有评论

2018年3月13日补:

自定义排序函数直接这样写

[cce_cpp]
bool paixu(node n1, node n2){
	//if (n1.time <= n2.time)	return true;
	//else return false;
	return n1.time < n2.time;
}
[/cce_cpp]

之前一直不知道C++中自带了sort函数,还能把结构体中的某一项进行排序,感觉挺神奇,虽然题还是WC,但是先写博文记录一下这个函数的用法吧。

[cce_cpp]
I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!

II)Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

Sort函数使用模板:

Sort(start,end,排序方法)
[/cce_cpp]

把所需要排序的东西放到一个结构体数组中。然后编写相应的排序函数即可。

代码:

[cce_cpp]
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include<algorithm>
using namespace std;

typedef struct student{
	char name[10];
	int score;
	int time;
}*PSTU;

bool stucmp(struct student A, struct student B){
	if (A.score > B.score)	return true;
	if (A.score == B.score&&A.time < B.time)	return true;
	if (A.score == B.score&&A.time == B.time&&strcmp(A.name, B.name) <= 0) return true;
	return false;
}

int main(){
	int n, m, i, scoretmp, timetmp,stunum;
	PSTU stu;
	//stu = (PSTU)malloc(sizeof(struct student));//生成头结点,不存数据
	//stu.next = (PSTU)malloc(sizeof(struct student));//第一个结点
	//stutmp[stunum] = stu.next;//临时值指向第一个结点
	stu = (PSTU)malloc(sizeof(struct student) * 1000);
	scanf("%d%d", &n, &m);
	stunum = 0;
	while (~scanf("%s", stu[stunum].name)){
		stu[stunum].score = 0;
		stu[stunum].time = 0;
		for (i = 0; i<n; i++)
		{
			scanf("%d", &scoretmp);
			if (scoretmp>0){
				stu[stunum].score++;
				stu[stunum].time += scoretmp;
				if (getchar() == '(')
				{
					scanf("%d", &timetmp); getchar();
					stu[stunum].time += timetmp * 20;
					//stu[stunum].time += timetmp;
				}
			}
		}
		stunum++;
		sort(stu, stu + stunum, stucmp);
		for(i=0;i<stunum;i++)
		{
			printf("%-10s %2d %4d\n", stu[i].name, stu[i].score, stu[i].time);
		}

	}

	return 0;
}
[/cce_cpp]

 

之前我一直用链表写的,链表排序的话实在太费劲,只做好了信息的输入和输出

[cce_cpp]
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct student{
	char name[10];
	int score;
	int time;
	struct student * next;
}*PSTU;

int main(){
	int n, m, i, scoretmp, timetmp;
	PSTU stu, stutmp, stuttmp;
	stu = (PSTU)malloc(sizeof(struct student));//生成头结点,不存数据
	stu->next = (PSTU)malloc(sizeof(struct student));//第一个结点
	stutmp = stu->next;//临时值指向第一个结点
	scanf("%d%d", &n, &m);
	while (~scanf("%s", stutmp->name)){
		stutmp->score = 0;
		stutmp->time = 0;
		for (i = 0; i<n; i++)
		{
			scanf("%d", &scoretmp);
			if (scoretmp>0){
				stutmp->score += scoretmp;
				if (getchar() == '(')
				{
					scanf("%d", &timetmp); getchar();
					stutmp->score += timetmp * 20;
					//stutmp->time += timetmp;
				}
			}
		}
		stutmp->next = (PSTU)malloc(sizeof(struct student));
		stutmp = stutmp->next;
		strcpy(stutmp->name, "0");
		stuttmp = stu;
		while (strcmp(stuttmp->next->name, "0") != 0){
			stuttmp = stuttmp->next;
			printf("name:%s time:%d score:%d\n", stuttmp->name, stuttmp->time, stuttmp->score);
		}

	}

	return 0;
}
[/cce_cpp]

发表评论

邮箱地址不会被公开。

Go