| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2478 人关注过本帖
标题:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
取消只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
看到一个很好的题,写了半天,没调出来。大家一起研究看看。
大学英语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
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
那样的效率不高。

你的那个if else肯定不可能过ACM
2009-09-15 22:41
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
你可以写个看看。
2009-09-15 22:48
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
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
回复 11楼 zhddragon
你说的是对的, 第三也许体现不出rank的优势。

我修改后的代码基本实现了。


程序代码:
#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 )              
                    BiTreeInsert(root->pre ,n);  
                if(root->key < n )               
                    BiTreeInsert(root->next,n);  
            }                                    
        }                                        
    void BiTreeRank(BiNode * root, int r , long & key ,bool & status)
        {                                                            
            if( NULL == root)                                        
            {                                                        
                return ;                                             
            }                                                        
            else                                                     
            {                                                        
                BiTreeRank( root->next, r , key, status);            
                Rank++;                                              
                if( Rank == r)                                       
                {                                                    
                    key=root->key;                                   
                    status =true;                                    
                }                                                    
                BiTreeRank( root->pre, r, key, status);              
            }                                                        
        }                                                            
    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;                                                  
            bool sta=false;                                          
            Rank=0;                                                  
            BiTreeRank(root,r, k,sta);
            if( sta == true )
                return k;
            else
                return -1;
        }
    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_key ;
        rank_key=tree->rank(3);
        if( rank_key == -1  )
            cout<<"NO such score!"<<endl;
        else
            cout<<rank_key<<endl;
    }
    return 0;
}
2009-09-16 00:01
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
两位能不能写代码密码,我没听说过那个Q S
2009-09-16 09:09
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
那就搞定他。
2009-09-16 13:56
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
Name: "zhougc" Problem ID "ct8_2"
Submit Time: 2009/9/14-13:46

G++: Compile OK

Test  1:    Runtime Error
--------------------------------
Problem ID     ct8_2
Test Result    Runtime Error
Total Time     NULL
Total Memory   24 Kb / 65000 Kb
Code Length    291 Bytes


是这个么?
2009-09-16 14:30
快速回复:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
数据加载中...
 
   



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

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