huawe

2016华为机试
**

1.老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

**

  • 暴力法

    #include <stdio.h>
    #include
    using namespace std;

    const int MAXN=100000;

    int data[MAXN+5];

    int querymax ( int l , int r ) {
    int ans=data[l];
    for(int i=l+1;i<=r;i++) ans=max(ans,data[i]);
    return ans;
    }

    void update(int idx,int value){
    data[idx]=value;
    }

    int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
    for(int i=1;i<=n;i++){
    scanf("%d",&data[i]);
    }
    char order;
    int a,b;
    for(;m–?{
    scanf(" %c%d%d",&order,&a,&b);
    if(order==‘U’){
    update(a,b);
    }else if(order==‘Q’){
    if(a>b)swap(a,b);
    printf("%d\n",querymax(a,b));
    }
    }
    }
    return 0;
    }

  • ACM法

#include <stdio.h>
#include
using namespace std;

const int MAXN=100000;

int data[MAXN+5];
int maxarr[MAXN*4+5];

void build(int p,int l,int r) {
if(l==r){
maxarr[p]=data[l];
return ;
}
int m = ( l + r ) >> 1 ;
int lchild=p<<1,rchild=p<<1|1;
build ( lchild , l , m ) ;
build ( rchild , m+1 , r ) ;
maxarr[p]=max(maxarr[lchild],maxarr[rchild]);
}

int querymax ( int L , int R , int p , int l , int r ) {
if ( L <= l && r <= R ) {
return maxarr[p];
}
int m = ( l + r ) >> 1 ;
int lans=-1,rans=-1;
if ( L <= m ) lans=querymax ( L , R , p << 1 , l , m ) ;
if ( m < R ) rans=querymax ( L , R , p << 1 | 1 , m + 1 , r ) ;
if(lans==-1)return rans;
if(rans==-1)return lans;
return max(lans,rans);
}

void update(int idx,int value,int p,int l,int r){
if(lr&&lidx){
maxarr[p]=value;
return;
}
int m = ( l + r ) >> 1 ;
if ( idx <= m ) update( idx, value, p << 1, l, m );
if ( m < idx ) update( idx, value, p << 1|1, m+1, r );
maxarr[p]=max(maxarr[p<<1],maxarr[p<<1|1]);
}

int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%d",&data[i]);
}
build(1,1,n);
char order;
int a,b;
for(;m–?{
scanf(" %c%d%d",&order,&a,&b);
if(order==‘U’){
update(a,b,1,1,n);
}else if(order==‘Q’){
if(a>b)swap(a,b);
printf("%d\n",querymax(a,b,1,1,n));
}
}
}
return 0;
}

2.开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
 
bool compare(pair<string, int> a, pair<string, int> b){
    return a.second > b.second;
}
int main(void){
    string input, file;
    vector<pair<string, int>> errors;
    while (getline(cin, input)){
        if (input.size() == 0)
            break;
        unsigned int f = input.rfind('\\');
        file = input.substr(f + 1);
        errors.push_back(make_pair(file, 1));
        for (int i = 0; i<(errors.size() - 1); i++){
            if (errors[i].first == file){
                errors[i].second++;
                errors.pop_back(); break;
            }
        }
    }
    stable_sort(errors.begin(), errors.end(), compare);
    int idx = 0;
    while (idx<8 && idx<errors.size()){
        string check = errors[idx].first;
        int t = check.find(' ');
        if (t>16)
            errors[idx].first.erase(0, t - 16);
        cout << errors[idx].first << ' ' << errors[idx].second << endl;
        idx++;
    }
}

3.扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王)?
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR

基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。

答案提示: (1)除了炸弹和对王之外,其他必须同类型比较。 (2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.

//“输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,
//不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列“
//这句规则让牌面类型的确定和大小的比较直接可以转换为牌个数的比较了,这是解决测试问题的捷径!
//所以一定要善于利用题目已知条件!!!
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    string line;
    while(getline(cin,line)){
        if(line.find("joker JOKER")!=-1)
            cout<<"joker JOKER"<<endl;
        else{
            int dash=line.find('-');
            string car1=line.substr(0,dash);
            string car2=line.substr(dash+1);
            int c1=count(car1.begin(),car1.end(),' ');
            int c2=count(car2.begin(),car2.end(),' ');
            string first1=car1.substr(0,car1.find(' '));
            string first2=car2.substr(0,car2.find(' '));
            string str="345678910JQKA2jokerJOKER";
            if(c1==c2){
                if(str.find(first1)>str.find(first2))
                    cout<<car1<<endl;
                else
                    cout<<car2<<endl;
            }else
                if(c1==4)
                    cout<<car1<<endl;
                else if(c2==4)
                    cout<<car2<<endl;
                else
                    cout<<"ERROR"<<endl;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值