代码运行超时,请问如何优化

PAT上这道题目德才论
我的代码如下

#include<iostream>
#include<algorithm>

using namespace std;

typedef struct student{
    int xuehao;    //学号
    int de;  //德分
    int cai;  //才分 
    char tag;   //德才类型 
}stu;

struct rule2
{
    bool operator()(const stu & a ,const stu & b)
    {  
        if(a.tag == b.tag)     //类型相同,比较总分 
        {
            if ((a.de+a.cai)==(b.de+b.cai))  //总分相同比较德分 
            {  
                   if(a.de == b.de)          //德分相同,比学号 
                        return a.xuehao < b.xuehao;  
                else  
                    return a.de > b.de;  
            } 
            else  
                return a.de+a.cai > b.de+b.cai;
        } 
        else
            return a.tag<b.tag;      
    }  
}; 

int main(void)
{
    int N,L,H;
    cin >> N >> L >> H;
    
    stu *s= new stu[N];
    int cnt = 0;        //统计合格人数 
    for(int i=0;i<N;i++)
    { 
        cin >> s[i].xuehao >> s[i].de >> s[i].cai;   //输入学生信息
        if(s[i].de<L || s[i].cai<L)   //不及格属于第五类学生 
        {
            s[i].tag = 5;
            continue;
        }
        else 
        {
            cnt++;
            //第一类学生,才德全尽 
            if(s[i].de>=H && s[i].cai>=H)
                s[i].tag = 1; 
            //第二类学生,德胜才 
            else if(s[i].de>=H && s[i].cai<H )
                s[i].tag = 2; 
            //第三类学生
            else if(s[i].de<H && s[i].cai<H  && s[i].de>= s[i].cai)
                s[i].tag = 3;
            //第四类学生
            else
                s[i].tag = 4;
            
        }
    }
    
    sort(s,s+N,rule2());
    
    cout << cnt << endl;
        
    for(int i=0; i<cnt;i++)
        cout << s[i].xuehao << " " << s[i].de << " " << s[i].cai<<endl;    
        
        return 0;      
}

5个测试用例中有两个显示运行超时,请问上述代码如何优化,我搜过一些参考答案,清一色使用<vector>来做的,我目前刚学C++,对<vector>不了解,所以初次之外,有没有别的优化方法?谢谢

阅读 7.9k
2 个回答

方法1:cstdio 库里的读入scanf 输出pirntf
方法2:读入优化cin.sync_with_stdio(false) 与方法一不能同时使用
自测

搞不清楚为啥OJ还需要用户自己去搞定c++的输入输出. 而不是专注算法.
看代码应该按规则排序么?如果仅仅是排序的话 那可以试试set.
每次输入的元素之后序列都是有序的. 省着单独用sort排序了.

  1. 实际上用无论上是用vector还是数组,本质上应该差别不大. 主要是std::sort带来了差异. 按理说sort时间复杂度是NLogN 但是在排序的时候会进行大量的搬移, 对于元素占空空间比较大的排序,时间可能会上来.
  2. 对比set排序,内部采用红黑树, 插入动作没有搬移的动作.这种场景下时间要占优.
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题