华为上机题汇总(十四)

华为上机题汇总(十四)

注:编译环境为Visual Studio 2012,答案仅供参考。

目录

第六十六题

66.问题描述
股票是一种有价证券,是股份公司为筹集资金发给投资者作为公司资本部分所有权的凭证,成为股东以此获得股息(股利),并分享公司成长或交易市场波动带来的利润;但也要共同承担公司运作错误所带来的风险。南邮华为俱乐部会长小郑同学最近计划进入股市淘金,看中一支股票,借本次华为赛机会,请你帮忙指出:何时买卖这支股票,才能获得最大收益。已知小郑投资A元,可以预测到未来12天该支股票的价格,请注意:
(1)股票每一天的价格都不一样;
(2)如果同时有两种安排获得一样的收益,选择在股价最低时购买;
(3)小郑在12天内只能购买一次股票,并且认购的股数必须为整数;
(4)如果按照股价趋势,不能获得收益,只需输出IMPOSSIBLE。
问题输入
输入包括多个测试用例,首先给出测试用例数B,接着给出B个测试用例。每一个测试用例包括两行,其中第一行给出小郑计划投资的资金数A,第一行给出以空格分隔的12个整数,指出未来12天股票每一天价格F。注意:100≤A≤500,B≤200,1≤F≤250。
问题输出
输出包括多行,对于每个测试用例输出一行,输出IMPOSSIBLE;或者以空格分隔的3个整数C、D、E,第1个整数C表示小郑第C天购买股票(1≤C≤11),第2个整数D表示小郑第D天卖出股票(C+1≤D≤12),第3个整数E表示小郑的股票收益。
样例输入
2
146
208 117 109 238 144 248 138 39 106 9 159 18
120
12 11 10 9 8 7 6 5 4 3 2 1
样例输出
10 11 2400
IMPOSSIBLE

#include <iostream>
#include <vector>
using namespace std;

inline int countIncome(int buy, int sell, int sum){
    int n = sum / buy;
    return (sell - buy) * n;
}

void printBest(vector<int> &v, int sum){
    int maxBuy = 0, maxSell = 0, maxIncome = 0;
    for (unsigned i = 0; i < v.size() - 1; i++)
    {
        for (unsigned j = i + 1; j  < v.size(); j ++)
        {
            int income = countIncome(v[i], v[j], sum);
            if (income > maxIncome || (income == maxIncome && v[i] < v[maxBuy]))
            {
                maxBuy = i;
                maxSell = j;
                maxIncome = income;
            }
        }
    }

    if (maxIncome == 0)
    {
        cout << "IMPOSSIBLE" << endl;
        return;
    }
    cout << maxBuy+1 << " " << maxSell+1 << " " << maxIncome << endl;
}

int main()
{
    int b;
    cin >> b;
    if (b < 0 ||b > 200)
    {
        cout << "IMPOSSIBLE" << endl;
        return 0;
    }
    while (b-- > 0)
    {
        vector<int> v;
        int sum;
        cin >> sum;
        if (sum < 100 || sum > 500)
        {
            cout << "IMPOSSIBLE" << endl;
            return 0;
        }
        for (int i = 0; i < 12; i++)
        {
            int num;
            cin >> num;
            if (num < 1 || num > 250)
            {
                cout << "IMPOSSIBLE" << endl;
                return 0;
            }
            v.push_back(num);
        }
        printBest(v, sum);
    }
    return 0;
}

第六十七题

67.笨笨熊搬家(交通版)
森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是R行、C列的矩阵,矩阵的每一个格子刚好是一天的行程。
矩阵由“B”、“-”、“#”、“H”四种字符成员组成,其中:
B:代表苯苯熊现在的房子;
H:代表笨笨熊新的豪宅;
-:代表可以通行的道路;
#:代表无法通过的障碍(高山、大河等);
此外,森林里也有交通规则地:在任务位置,只能向“上、下、左、右”四个方向中的其中一个方向行走。

运行时间限制: 无限制
内存限制: 无限制
输入: 4 // R的数值
4 // C的数值,下面是地图。

--##---
B-----H
#---#--
-------

输出: Y //代表道路可达

N //代表道路不通

样例输入: 1
5
-B-H#
样例输出: Y

#include <iostream>
#include <vector>
using namespace std;

bool canVisit(const vector<int> &v, int index){
    for (unsigned i = 0; i < v.size(); i++)
    {
        if (index == v[i])
        {
            return false;
        }
    }
    return true;
}

bool bearHome(int row, int col, int rows, int cols, int endIndex, char **map, vector<int> hasVistited){
    if (row * cols + col == endIndex)
    {
        return true;
    }
    bool up = false, down = false, left = false, right = false;
    if (row > 0)
    {
        int index = (row-1) * cols + col;
        if (map[row-1][col] != '#' && canVisit(hasVistited,index))
        {
            vector<int> tmp = hasVistited;
            tmp.push_back(index);
            up = bearHome(row-1,col,rows,cols,endIndex,map,tmp);
        }
    }

    if (row < rows-1)
    {
        int index = (row+1) * cols + col;
        if (map[row+1][col] != '#' && canVisit(hasVistited,index))
        {
            vector<int> tmp = hasVistited;
            tmp.push_back(index);
            down = bearHome(row+1,col,rows,cols,endIndex,map,tmp);
        }
    }

    if (col > 0)
    {
        int index = row * cols + col-1;
        if (map[row][col-1] != '#' && canVisit(hasVistited,index))
        {
            vector<int> tmp = hasVistited;
            tmp.push_back(index);
            left = bearHome(row,col-1,rows,cols,endIndex,map,tmp);
        }
    }

    if (col < cols-1)
    {
        int index = row * cols + col+1;
        if (map[row][col+1] != '#' && canVisit(hasVistited,index))
        {
            vector<int> tmp = hasVistited;
            tmp.push_back(index);
            right = bearHome(row,col+1,rows,cols,endIndex,map,tmp);
        }
    }

    return up || down || left || right;
}

int main()
{
    int rows,cols;
    int row,col,endIndex;
    vector<int> v;
    cin >> rows >> cols;
    char **map = new  char *[rows];
    for (int i = 0; i < rows; i++)
    {
        map[i] = new char [cols];
    }

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            cin >> map[i][j];
            if (map[i][j] == 'B')
            {
                row = i;
                col = j;
            }
            if (map[i][j] == 'H')
            {
                endIndex = i * cols + j;
            }
        }
    }

    cout << (bearHome(row,col,rows,cols,endIndex,map,v) ? "Y" : "N") << endl;
    return 0;
}

第六十八题

68.正数的进制转换

#include <iostream>
#include <string>
using namespace std;

void converFromTen(int n, int k){
    string s;
    while (n != 0)
    {
        int tmp = n % k;
        if (tmp < 10)
        {
            s.push_back(tmp + '0');
        }
        else
        {
            s.push_back(tmp - 10 + 'A');
        }
        n /= k;
    }
    reverse(s.begin(), s.end());
    cout << s << endl;
}

int convertToTen(const string &s, int k){
    int result = 0;
    for (unsigned i = 0; i < s.size(); i++)
    {
        int tmp;
        if (s[i] >= '0' && s[i] <= '9')
        {
            tmp = s[i] - '0';
        }
        else
        {
            tmp = s[i] - 'A' + 10;
        }
        result += tmp * pow(k,s.size()-i-1);
    }
    return result;
}

int main()
{
    int n , k;
    // 输入十进制数
    cin >> n;
    // 输入目标进制
    cin >> k;
    converFromTen(n,k);

    string s;
    // 输入某进制数
    cin >> s;
    // 输入当前进制
    cin >> k;
    cout << convertToTen(s,k) << endl;
    return 0;
}

第六十九题

69.删除一个字符串首尾的下划线

#include <iostream>
#include <string>
using namespace std;

void deleteLine(string &s){
    int pos1 = -1, pos2 = -1;
    for (unsigned i = 0; i < s.size(); i++)
    {
        if (s[i] != '_')
        {
            pos1 = i;
            break;
        }
    }


    for (int i = (int)s.size() - 1; i >= 0; i--)
    {
        if (s[i] != '_')
        {
            pos2 = i;
            break;
        }
    }

    if (pos1 < 0 && pos2 < 0)
    {
        s.clear();
        return;
    }

    int length = pos2 - pos1 + 1;
    for (int i = 0; i < length; i++)
    {
        s[i] = s[pos1+i];
    }
    s.erase(s.begin()+length,s.end());
}

int main()
{
    string s;
    getline(cin,s);
    deleteLine(s);
    if (s.size())
    {   
        cout << s << endl;
    }
    return 0;
}

第七十题

70.删除字符串中重复字符并排序

#include <iostream>
using namespace std;

int cmp(const void *a, const void *b){
    return *(char*)a - *(char*)b;
}

void deleteRepeat(char *input, char *output){
    char chars[256];
    for (int i = 0; i < 256; i++)
    {
        chars[i] = false;
    }
    char *p = output;
    while (*input != '\0')
    {
        if (chars[*input])
        {
            input++;
        }
        else
        {
            chars[*input] = true;
            *p++ = *input++;
        }
    }
    *p = '\0';

    qsort(output,strlen(output),sizeof(char),cmp);
}

int main()
{
    char input[100],output[100];
    cin.getline(input,100);
    deleteRepeat(input,output);
    cout << output << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值