用LUA(和C++)刷PAT (Advanced Level) ——1062 Talent and Virtue (25 分)

本文探讨了一位程序员在处理排序和链表操作时遇到的问题,首先描述了编写复杂排序算法的过程,然后指出这些算法在性能上并不优于简单的直接排序。作者通过示例展示了如何对链表进行排序,包括按美德、成绩和特定条件进行排序,并最终通过插入排序优化得到有序结果。文章强调了在编程中避免过度设计并追求效率的重要性。
摘要由CSDN通过智能技术生成

一杯茶,一包烟,一个j – 没写查一天。
另外发现花里胡哨写了一堆,性能还没有直接排序来得强…蓝瘦,考试写链表真的想不开…

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

struct person{
    int id, virtue, talent;
    person* next = NULL;
};
    
int N, L, H, M = 0;

int sortByVirtue(person* p){ return 100 - p->virtue; }
int sortByGrade(person* p){ return 200 - (p->virtue + p->talent); }
int sortByType(person* p)
{ 
    if(p -> virtue >= H && p -> talent >= H)
        return 0;
    if(p -> virtue >= H)
        return 1;
    if(p -> virtue >= p -> talent)
        return 2;
    return 3;
}

person* sort(person* head, int (*getType)(person*), int typeNumber){
    person** info = (person**)malloc(sizeof(person*) * typeNumber);
    person** tails = (person**)malloc(sizeof(person*) * typeNumber);
    memset(info, 0, sizeof(person*) * typeNumber);
    memset(tails, 0, sizeof(person*) * typeNumber);
    person* ptr = head;

    while(ptr != NULL){
        int type = (*getType)(ptr);
        if(tails[type] != 0){
            tails[type]->next = ptr;
            ptr = ptr->next;
            tails[type] = tails[type]->next;
            tails[type]->next = NULL;
        }
        else
        {
            info[type] = ptr;
            tails[type] = ptr;
            ptr = ptr->next;
            tails[type]->next = NULL;
        }
    }
    
    person* ret = NULL;
    head = NULL;
    for(int i = 0; i < typeNumber; i++)
    {
        if(tails[i] != 0){
            head == NULL ? head : head -> next = info[i];
            ret = ret == NULL ? info[i] : ret;
            head = tails[i];
        }
    }
    free(info);
    free(tails);
    return ret;
}

int main()
{
    cin>>N>>L>>H;
    person* head = (person*)malloc(sizeof(person)), *ptr = head;
    for(int i = 0; i < N; i++){
        person* p = (person*)malloc(sizeof(person));
        cin>>p->id>>p->virtue>>p->talent;
        if(p -> virtue >= L && p -> talent >= L)
        {
            ptr->next = p;
            ptr = p;
            M++;
        }
    }
    ptr -> next = NULL;
    
    cout<<M<<endl;
    if (M <= 0) return 0;
    head = head->next;
    
    head = sort(head, sortByVirtue, 101); //根据virtue排序
    head = sort(head, sortByGrade, 201); //根据grade排序
    head = sort(head, sortByType, 4); //根据类型排序
    person* result[100000]; //id进行插入排序
    for (int i = 0; i < M ;i++){
        result[i] = head;
        head = head->next;
    }
    for (int i = 0; i < M ; i++){
        int j = i - 1;
        while(j >= 0 && 
              result[j]->virtue == result[j + 1]->virtue &&
              result[j]->talent == result[j + 1]->talent &&
              result[j]->id > result[j + 1]->id
             )
        {
            person* temp = result[j+1];
            result[j + 1] = result[j];
            result[j] = temp;
            j--;
        }
    }
    
    for (int i = 0; i < M ;i++)
        printf("%d %d %d\n", result[i]->id, result[i]->virtue, result[i]->talent);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值