标签:
注:编译环境为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;
}
标签:
原文地址:http://blog.csdn.net/sps900608/article/details/52212963