这题主要问题就是运行时间的问题,给的条件太多了导致了代码的循环次数就很多这时候就只能考虑排序算法了,网上看到了qsort()函数,感觉非常的好用啊我先详细将一下我对qsort()函数的理解
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
使用它要调用<stdlib.h>
它采用的是快速排序的方法,对于快排大家肯定不模式时间复杂度是n*log(n)
其次使用qsort()函数要四个参数
1,void *base 要排序数组的第一个元素指针
2,size_t nitems, 要排序数组元素的个数
3, size_t size ,数组每个元素的大小,可以用sizeof()来获得
4, int (*compar)(const void *, const void*)) 用来比较两个元素的函数
这个函数是返回整型,
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include<string>
#include<math.h>
using namespace std;
typedef struct student {
int SN;
int moral;
int talent;
int flag=0;
int sum;
}st;
int ss(const void* a, const void* b) {
st *pa = (st*)a;
st *pb = (st*)b;
if (pa->flag < pb->flag) {
return -1;//flag小的在前面
}
else if (pa->flag == pb->flag && pa->sum > pb->sum) {
return -1;//flag相同时总分大的在前面
}
else if (pa->flag == pb->flag && pa->sum == pb->sum && pa->moral > pb->moral) {
return -1;//flag相同时总分相同德分大的在前面
}
else if (pa->flag == pb->flag && pa->sum == pb->sum && pa->moral == pb->moral&&pa->SN<pb->SN) {
return -1;
}
else {
return 1;
}
}
int main() {
int a, l, h;
int no = 0;
cin >> a >> l >> h;
st* xue = new st[a];
for (int i = 0;i < a;i++) {
cin >> xue[i].SN >> xue[i].moral >> xue[i].talent;
xue[i].sum = xue[i].moral + xue[i].talent;
if (xue[i].moral >= h && xue[i].talent >= h) {
xue[i].flag = 1;
}
else if (xue[i].moral >= h&&xue[i].talent>=l) {
xue[i].flag = 2;
}
else if (xue[i].moral >= l && xue[i].talent >= l&&xue[i].moral>=xue[i].talent) {
xue[i].flag = 3;
}
else if (xue[i].moral >= l && xue[i].talent >= l) {
xue[i].flag = 4;
}else {
xue[i].flag = 5;
no++;
}
}
qsort(xue, a, sizeof(st), ss);
cout << a - no << endl;
for (int i = 0;i < a - no;i++) {
cout << xue[i].SN << " " << xue[i].moral << " " << xue[i].talent << endl;
}
}