zoukankan      html  css  js  c++  java
  • 搜狐2016研发工程师编程题

    1、[编程题]马戏团

    搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。 现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。

    输入描述:
    首先一个正整数N,表示人员个数。 
    之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
    输出描述:
    正整数m,表示罗汉塔的高度。
    输入例子:
    6
    1 65 100
    2 75 80
    3 80 100
    4 60 95
    5 82 101
    6 81 70
    输出例子:
    4
    代码如下:
    (注:在按体重从小到大来排列后,再沿着身高递增来动态归化,如果在体重相等时按照身高递增排列,
    在最后会将所有体重相等的情况都计划进去,那样的话当体重相等时不能很好达到动态规划的选择效果。)
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    struct member{
        int weight;
        int height;    
    };
    
    bool cmp(member m1,member m2){
        //按体重从小到大排列
        if(m1.weight!=m2.weight)
            return m1.weight<=m2.weight;
        else  //体重相同时,身高高的放在前面
            return m1.weight>m2.weight;
    }
    
    int main(){
        int N;
        int index;
        int H;
        int W;
        vector<member> m;
        while(cin>>N){
            m.clear();
            for(int i=0;i<N;i++){
                member mem;
                cin>>index>>W>>H;
                mem.weight=W;
                mem.height=H;
                m.push_back(mem);
            }
            sort(m.begin(),m.end(),cmp);
            //按身高求取最大上升子序列
            vector<int> dp(N,1);
            int max_m=0;
            for(int i=1;i<N;i++){
                for(int j=0;j<i;j++){
                    if(m[i].height>=m[j].height && dp[j]+1>dp[i]){
                        dp[i]=dp[j]+1;
                    }
                }
            }
            for(int i=0;i<N;i++){
                if(max_m<dp[i])
                    max_m=dp[i];
            }
            cout<<max_m<<endl;
        }
        return 0;
    }
    

    VS2013运行结果:

      



    2、[编程题]扎金花

    两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。
    
    游戏规则:
    共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 
    
    对于牌型的规则如下: 
    1.三张牌一样即为豹子 
    2.三张牌相连为顺子(A23不算顺子) 
    3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,
    依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。
    输入描述:
    输入两个字符串代表两个玩家的牌(如"10KQ" "354"),先输入的作为玩家1,后输入的作为玩家2
    输出描述:
    1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入
    输入例子:
    KQ3 3Q9
    10QA 6102
    5810 7KK
    632 74J
    10102 K77
    JKJ 926
    68K 27A
    输出例子:
    1
    1
    -1
    -1
    1
    1
    -1
    代码如下:
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std ;
     
    vector<int> trans(string s){
        vector<int> vec;
        for ( int i= 0 ; i<s. size (); i++) {
            if (s[ i ]== '1' && s[i+1]=='0') {
                vec. push_back ( 10 ); //1和0是一个整体
                ++i;
            }
            else if (s[ i ]== 'J' ) vec. push_back ( 11 );
            else if (s[ i ]== 'Q' ) vec. push_back ( 12 );
            else if (s[ i ]== 'K' ) vec. push_back ( 13 );
            else if (s[ i ]== 'A' ) vec. push_back ( 14 );
            else {
               int a=( int )(s[ i ]- '0' );
               vec. push_back (a);
            }
        }
     
        sort (vec. begin (), vec. end ());
        return vec;
    }
     
    int pmtype( vector < int > vec){
        if (vec[ 0 ]==vec[ 1 ]&&vec[ 1 ]==vec[ 2 ]) {
            return 3 ;  // 豹子
        }
     
        if ((vec[ 0 ]+ 1 ==vec[ 1 ])&&(vec[ 1 ]+ 1 ==vec[ 2 ])) {
            return 2 ; // 顺子
        }
     
        if (vec[ 0 ]!=vec[ 1 ]&&vec[ 0 ]!=vec[ 2 ]&&vec[ 1 ]!=vec[ 2 ]) {
            return 0 ; // 普通牌型即单牌
        }
     
        return 1 ; // 对子
    }
     
    int main(){
        string s1,s2;
        while ( cin >>s1>>s2) {
            vector < int > vec1= trans (s1);
            vector < int > vec2= trans (s2);
             
            if(vec1.size()!=3 || vec2.size()!=3){//不合理情况
                cout<<-2<<endl;
                continue;
            }
     
            int pmtype1= pmtype (vec1);
            int pmtype2= pmtype (vec2);
            if (pmtype1>pmtype2) {
                cout << 1 << endl ;
            }
     
            if (pmtype1<pmtype2) {
                cout << -1 << endl ;
            }
     
            if (pmtype1== 3 &&pmtype2== 3 ) {
                if (vec1[ 0 ]>vec2[ 0 ]) { 
                    cout << 1 << endl ;
                }
     
                if (vec1[ 0 ]==vec2[ 0 ]) {  //不合理情况
                    cout << -2 << endl ;
                }
     
                else cout <<-1 << endl ;
            }
     
            if (pmtype1== 2 && pmtype2== 2 ) {
                if (vec1[ 0 ]>vec2[ 0 ]) { cout << 1 << endl ;}
                if (vec1[ 0 ]==vec2[ 0 ]) { cout << 0 << endl ;}
                else cout <<- 1 << endl ;
            }
     
            if (pmtype1== 1 && pmtype2== 1 ) {
                int a,b;
                if (vec1[ 0 ]==vec1[ 1 ]) {
                    a=vec1[ 0 ];
                }
                else {
                    a=vec1[ 1 ];
                }
                if (vec2[ 0 ]==vec2[ 1 ]) {
                    b=vec2[ 0 ];
                }
                else {
                    b=vec2[ 1 ];
                }
     
                if (a==b) {
                    int c,d;
                    if (a==vec1[ 0 ]) {
                        c=vec1[ 2 ];
                    }
                    else c=vec1[ 0 ];
     
                    if (b==vec2[ 0 ]) {
                        d=vec2[ 2 ];
                    }
                    else d=vec2[ 0 ];
     
                    if (c>d) {
                        cout << 1 << endl ;
                    }
                    if (c<d) {
                       cout << -1 << endl ;
                    } 
                    else cout << 0 << endl ;
                } 
     
                if (a>b) {
                    cout << 1 << endl ;
                } 
                else { 
                    cout <<- 1 << endl ;
                }
            }
     
            if (pmtype1== 0 && pmtype2== 0 ) {
                if (vec1[ 2 ]!=vec2[ 2 ]) {
                    if (vec1[ 2 ]>vec2[ 2 ]) {
                       cout << 1 << endl ;
                        continue ;
                    }
                    else {
                       cout <<- 1 << endl ;
                       continue ;
                    }
                }
     
                if (vec1[ 1 ]!=vec2[ 1 ]) {
                    if (vec1[ 1 ]>vec2[ 1 ]) {
                        cout << 1 << endl ; 
                        continue ;
                    }
                    else { 
                        cout <<- 1 << endl ;
                        continue ;
                    }
                }
     
                if (vec1[ 0 ]!=vec2[ 0 ]) {
                    if (vec1[ 0 ]>vec2[ 0 ]) {
                        cout << 1 << endl ; 
                        continue ;
                    } 
     
                    if (vec1[ 0 ]<vec2[ 0 ]) { 
                        cout <<- 1 << endl ; 
                        continue ;
                    }
                }
     
                else cout << 0 << endl ;
            }
        }
     
        return 0 ;
    }
    

    运行结果:(http://www.anycodes.cn/zh/     在线编程网站运行)

    输入:

    KQ3 3Q9
    10QA 6102
    5810 7KK
    632 74J
    10102 K77
    JKJ 926
    68K 27A
    333 333
    55 99
    

    输出:  

    3、[编程题]发奖金  

    狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,
    但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,
    每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,
    作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。
    输入描述:
    每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
    输出描述:
    输出至少需要多少w的奖金
    输入例子:
    10
    20 
    32 
    12 
    32 
    45 
    11 
    21 
    31 
    41 
    33
    输出例子:
    20

    代码如下:
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int main()
    {
        int N;
        while(cin>>N)
        {
          vector<int> chengji(N);
          for(int i=0;i<N;i++)
              cin>>chengji[i];
          vector<int> money(N,1);
          //由于每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩
          //从前往后(正向),第一个初始化为 1W ,依次往后初始化 i +1 的 money 值:
          //1、当 i 对应的成绩比 i+1 的成绩低时, i+1 应该拿到更多的前,所以有 money[i+1]=money[i]+1;
          //2、当 i 对应的成绩跟 i+1 相等时,反正也看不到,将 money[i+1] 设为 1 ;
          //3、当 i 对应的成绩比 i +1 高时,money[i+1] 应该是此时较小的,将其设为 1 ,对于这种下降的情况,可以采用反向循环更新
          //的方法
          for(int i=1;i<N;i++)
          {//正向
             if(chengji[i]>chengji[i-1])
                 money[i]=money[i-1]+1;
              else if(chengji[i]==chengji[i-1])
                 money[i]=money[i-1];
          }
          for(int i=N-2;i>=0;i--)
          {//反向
              if(chengji[i]>chengji[i+1])
                  money[i]=max(money[i],money[i+1]+1);
          }
          int result=0;
          for(int i=0;i<N;i++)
              result+=money[i];
           cout<<result<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    js setTimeout深度递归后完成回调
    [Err]1267
    YII数据库操作中打印sql
    Creating a web server in pure C(c/c++ 写web server)
    lighttpd 介绍及安装
    HDU 1003 Max Sum
    2014-8-10 掉落不简单
    最全SpringMVC具体演示样例实战教程
    Android 之 资源文件的介绍及使用
    我的创业劲儿,无可阻挡-JAVA学院张孝伟
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/5353137.html
Copyright © 2011-2022 走看看