华为上机题汇总(十四)

华为上机题汇总(十四)

注:编译环境为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;
}
时间: 2024-12-29 21:57:08

华为上机题汇总(十四)的相关文章

华为上机题汇总(四)

华为上机题汇总(四) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总四 目录 第十六题 第十七题 第十八题 第十九题 第二十题 第十六题 16.将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述: 有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序). 说明: 1.

华为上机题汇总(十)

华为上机题汇总(十) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十 目录 第四十六题 第四十七题 第四十八题 第四十九题 第五十题 第四十六题 46.在给定字符串中找出单词( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如

华为上机题汇总(十六)

华为上机题汇总(十六) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十六 目录 第七十六题 第七十七题 第七十八题 第七十九题 第八十题 第七十六题 消除类游戏很多,一般横.竖.斜有连续三个及以上相同就可以消除,为降低难度,本题只需要考虑一维的横消除即可, 即在给定的一组数字中(个,用例保证只有个),如果有连续三个及以上的数字相同,则将这些数字消除, 同时如果前一次消除后导致后面连在一起的也有三个及以上的数字相同,需继续消除,最终输出不能消除的剩余的数

华为上机题汇总(十九)

华为上机题汇总(十九) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十九 目录 第九十一题 第九十二题 第九十三题 第九十四题 第九十五题 第九十一题 91.按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为'0'--'9'或者'A'--'F'或者'a'--'f',则

华为上机题汇总(十五)

华为上机题汇总(十五) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十五 目录 第七十一题 第七十二题 第七十三题 第七十四题 第七十五题 第七十一题 71.渡口问题: 同类车辆先来先上,客车优于货车,客车上了4辆后才可以上货车,客车不足4辆可用货车补充. 客车为0,货车为1 输入:5 00101 输出:01324 #include <iostream> #include <queue> #include <vector> u

华为上机题汇总(十二)

华为上机题汇总(十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十二 目录 第五十六题 第五十七题 第五十八题 第五十九题 第六十题 第五十六题 56.在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是"夫妻相".所谓"夫妻相",就是两个人看上去比较般配,长相.身材等某些方面有一定的相似度.本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具"夫妻相"的人. 题目中预先给定一组女士的姓名拼音.输

华为上机题汇总(十八)

华为上机题汇总(十八) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十八 目录 第八十六题 第八十七题 第八十八题 第八十九题 第九十题 第八十六题 86.合并输入的两个整形数组并去掉重复的数字按升序输出: 案例输入:3 1 2 5 -10 3 2 案例输出:-10 1 2 3 5 #include <iostream> #include <vector> #include <algorithm> using namespac

华为上机题汇总(二十)

华为上机题汇总(二十) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十 目录 第九十六题 第九十七题 第九十八题 第九十九题 第一百题 第九十六题 96 . 给分数的循环节加括号 两个整数相除,将结果用字符串返回.如果是循环小数,将循环的位用括号括起来. 输入:1 3 输出:0.(3) 输入 1 7 输出 0.(142857) #include <iostream> #include <string> using namespace s

华为上机题汇总(二十二)

华为上机题汇总(二十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十二 目录 第一百零六题 第一百零七题 第一百零八题 第一百零九题 第一百一十题 第一百一十一题 第一百零六题 106.去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元 现输入总人数和总花费 #include <iostream> #include <vector> using namespace std; void display(const vector<