注:编译环境为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; }