标题:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
只看楼主
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
已结贴  问题点数:20 回复次数:28 
看到一个很好的题,写了半天,没调出来。大家一起研究看看。
大学英语4级考试,想知道全校第3名学生的成绩是多少?
如果最高分有好多个学生,则相同成绩的学生都算第一名;同理,如果第二高分的有多个学生,都算第二名。
当然这是简单题,请你快速编一个程序找到第3名的成绩。

输入:输入有多组,每组有2行,第一行是学生人数N(1<=N<10000),第二行有N个整数,分别表示每个学生的成绩(0到1e9)。当输入的N为0的时候结束程序。

输出:对于每组输入,输出只有一行,即第3名学生的成绩,如果找不到,则输出No such score !

Sample input:
10
90 84 90 60 70 65 73 85 98 98
5
90 90 89 90 90
0

Sample output:
85
No such score !


我的想法是用二叉树,然后递归rank

个人感觉算法还 ok这里是我的code

但是貌似调不过

程序代码:
#include<iostream>                                                                                                           
using namespace std;                                                                                                         
struct BiNode{                                                                                                               
    long key;                                                                                                                
    BiNode *pre;                                                                                                             
    BiNode *next;                                                                                                            
    BiNode(long n){ key =n ;pre=NULL; next=NULL;}                                                                            
};                                                                                                                           
class BiTree{                                                                                                                
private:                                                                                                                     
    static int Rank;                                                                                                         
    void BiTreeInsert(BiNode *&root,long n)                                                                                  
        {                                                                                                                    
            if( NULL == root)                                                                                                
            {                                                                                                                
                root= new BiNode(n);                                                                                         
            }                                                                                                                
            else                                                                                                             
            {                                                                                                                
                if( root->key < n )                                                                                          
                    root->pre=new BiNode(n);                                                                                 
                if(root->key >n )                                                                                            
                    root->next=new BiNode(n);                                                                                
                if( root->key == n)                                                                                          
                    return ;                                                                                                 
            }                                                                                                                
        }                                                                                                                    
    void BiTreeRank(BiNode * root, int r , long & key)                                                                       
        {                                                                                                                    
            if( NULL == root)                                                                                                
            {                                                                                                                
                return ;                                                                                                     
            }                                                                                                                
            else                                                                                                             
            {                                                                                                                
                BiTreeRank( root->next, r , key);                                                                            
                Rank++;                                                                                                      
                if( Rank == r)                                                                                               
                    key=root->key;                                                                                           
                BiTreeRank( root->pre, r, key);                                                                              
            }                                                                                                                
        }                                                                                                                    
    void BiTreeShow(BiNode * root )                                                                                          
        {                                                                                                                    
            if(NULL == root)                                                                                                 
                return ;                                                                                                     
            BiTreeShow(root->pre);                                                                                           
            cout<<root->key<<" ";                                                                                            
            BiTreeShow(root->next);                                                                                          
        }                                                                                                                    
    void BiTreeDestroy(BiNode *root){                                                                                        
        if( NULL == root)                                                                                                    
            return ;                                                                                                         
        BiTreeDestroy(root->pre);                                                                                            
        BiTreeDestroy(root->next);                                                                                           
        delete root;                                                                                                         
    }                                                                                                                        
public:                                                                                                                      
    BiNode *root;                                                                                                            
    BiTree(){ root = NULL ;}                                                                                                 
    ~BiTree()                                                                                                                
        {                                                                                                                    
            // BiTreeDestroy(root);                                                                                          
        }                                                                                                                    
    void insert(long n){ BiTreeInsert(root, n);}                                                                             
    long rank(int r)
        {
            long k;
            BiTreeRank(root,r, k);
            return k;
        }
    void show(){ BiTreeShow( root);}
};
int BiTree::Rank=0;
int main()
{
    int n;
    long key;
    while(cin>>n)
    {
        if ( 0 == n)
            break;
        BiTree *tree=new BiTree();
        for( int i=0;i<n;i++)
        {
            cin>>key;
            tree->insert(key);
        }

        tree->show();
        cout<<endl;
        int rank=-1;
        rank=tree->rank(1);
        if( -1 == rank )
            cout<<"NO such score!"<<endl;
        else
            cout<<rank<<endl;
    }
    return 0;
}


哪位高人帮check一下。
搜索更多相关主题的帖子: 调出 研究 
2009-09-15 22:08
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:3 
连排序都不需要, 一个简单的 if else就可以了

我就是真命天子,顺我者生,逆我者死!
2009-09-15 22:11
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
那样的效率不高。

你的那个if else肯定不可能过ACM
2009-09-15 22:41
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 3楼 Devil_W
O(n)过不了?

我就是真命天子,顺我者生,逆我者死!
2009-09-15 22:45
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
你可以写个看看。
2009-09-15 22:48
已屏蔽
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:124
注 册:2009-9-5
得分:3 
设置int a[3]。。。分别记录第一名~第三名的成绩。。。每读取一个数与a一一比对,如果超过了就顺次覆盖。。。最后返回a[2]。。。

我感觉是这样
2009-09-15 22:54
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 6楼 已屏蔽
我也是这样想的

我就是真命天子,顺我者生,逆我者死!
2009-09-15 22:55
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
本质上求rank的都不应该是你们两个说的那样

我看到过SBT树求rank的效率是最高的。

比RBT更高的效率。
2009-09-15 23:10
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
以下是引用BlueGuy在2009-9-15 22:55的发言:

我也是这样想的



你写不出n的,貌似至少也要3n左右。
2009-09-15 23:12
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
得分:3 
以下是引用Devil_W在2009-9-15 23:12的发言:

 
 
 
你写不出n的,貌似至少也要3n左右。
先跟第二大的比,再决定跟最大的还是第三大的比,这样会小于或等于2n

身体是玩命的本钱
2009-09-15 23:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-285843-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.112636 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved