标签:
注:编译环境为Visual Studio 2012,答案仅供参考。
106.去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元 现输入总人数和总花费
#include <iostream>
#include <vector>
using namespace std;
void display(const vector<int> &v){
int man = 0, woman = 0, child = 0;
for (unsigned i = 0; i < v.size(); i++)
{
switch (v[i])
{
case 3:
man++;
break;
case 2:
woman++;
break;
case 1:
child++;
break;
default:
break;
}
}
cout << man << " " << woman << " " << child << endl;
}
void compute(int n, int sum, int now,const vector<int> &v){
if (sum == 0 && n== 0)
{
display(v);
return;
}
if (sum < 0 || n == 0)
{
return;
}
for (int i = now; i <= 3; i++)
{
vector<int> tmp = v;
tmp.push_back(i);
compute(n-1,sum-i,i,tmp);
}
}
int main()
{
int n, sum;
cin >> n >> sum;
vector<int> v;
compute(n,sum,1,v);
return 0;
}
107.字符串权值
输入两个字符串(都是字母) a到z每个字母有一个权值(1-26)不区分大小写哪个字母分配哪个权值由你决定 字符串的权值就是字符串中所有字母的权值之和。
现要求自行分配权值使得两个字符串的权值之差最大 输出最大权值之差(提示:先把字符串中的相同字母去掉,再分配权值)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void lowerString(string &s){
for (unsigned i = 0; i < s.size(); i++)
{
s[i] = tolower(s[i]);
}
}
int compute(const string &s1, const string &s2){
string tmp1 = s1, tmp2 = s2;
lowerString(tmp1);
lowerString(tmp2);
sort(tmp1.begin(),tmp1.end());
sort(tmp2.begin(),tmp2.end());
auto pos1 = unique(tmp1.begin(),tmp1.end());
auto pos2 = unique(tmp2.begin(),tmp2.end());
tmp1.erase(pos1,tmp1.end());
tmp2.erase(pos2,tmp2.end());
auto b1 = tmp1.begin(), b2 = tmp2.begin();
int common = 0;
while (b1 != tmp1.end() && b2 != tmp2.end())
{
if (*b1 == *b2)
{
common++;
b1++;
b2++;
}
else if (*b1 < *b2)
{
b1++;
}
else
{
b2++;
}
}
int d1 = (int)tmp1.size() - common;
int d2 = (int)tmp2.size() - common;
int sum1 = 0, sum2 = 0;
for (int i = 0; i < d1; i++)
{
sum1 += 26 - i;
}
for (int i = 0; i < d2; i++)
{
sum2 += 1 + i;
}
return sum1 - sum2;
}
int main()
{
string s1,s2;
cin >> s1 >> s2;
cout << compute(s1,s2) << endl;
return 0;
}
108.M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。
1<=M<=10,1<=N<=10
例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法
输入 7 3
输出 8
#include <iostream>
#include <vector>
using namespace std;
void putApple(int apple, int basket, int now, int &sum){
if (apple == 0 && basket == 0)
{
sum++;
return;
}
if (apple == 0 || basket < 0)
{
return;
}
for (int i = now; i <= apple; i++)
{
putApple(apple-i,basket-1,i,sum);
}
}
int main()
{
int apple, basket, sum = 0;
cin >> apple >> basket;
putApple(apple,basket,0,sum);
cout << sum << endl;
return 0;
}
109.洞穴逃生
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。
精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。
精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。
你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出”Yes”,并输出逃出所用的最短时间;
若不能逃出,则输出”No”,同时输出精灵王子在剩下的时间内能走的最远距离。
注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。
注:M、S、T均是大于等于的整数。由输入保证取值合法性,考生不用检查。
提醒:
如果输入的S为,则说明本身已经在出口,输出应为:Yes 0
如果输入的T为(且S不为),则说明已经没有时间了,输出应为:No 0
输入: 输入格式:
M
S
T
输出: 输出格式:
Yes 逃出洞穴所用的最短时间
或
No 在洞穴塌陷前能逃跑的最远距离
样例输入: 10 50 5
样例输出: Yes 1
#include <iostream>
using namespace std;
bool judge(int m, int s, int t, const int S, const int T, int &minT, int &maxS){
if (s >= S)
{
minT = t < minT ? t : minT;
return true;
}
if (t == T && s < S)
{
maxS = s > maxS ? s : maxS;
return false;
}
if (m >= 10)
{
return judge(m-10, s+60, t+1, S, T, minT, maxS);
}
else
{
bool flag1 = judge(m+4, s, t+1, S, T, minT, maxS);
bool flag2 = judge(m, s+17, t+1, S, T, minT, maxS);
return flag1 || flag2;
}
}
int main()
{
int m, s, t;
cin >> m >> s >> t;
int minT = t, maxS = 0;
if (judge(m,0,0,s,t,minT,maxS))
{
cout << "YES " << minT << endl;
}
else
{
cout << "NO " << maxS << endl;
}
return 0;
}
110.建立一个二叉树,求其高度,并且判断是否为平衡二叉树
#include <iostream>
using namespace std;
struct BTreeNode
{
int value;
BTreeNode *left;
BTreeNode *right;
};
void insertNode(BTreeNode **p_root, int value){
if (!*p_root)
{
*p_root = new BTreeNode();
(*p_root)->value = value;
return;
}
BTreeNode *p = *p_root;
while (p)
{
if (value == p->value)
{
return;
}
else if (value < p->value)
{
if (!p->left)
{
BTreeNode *pNode = new BTreeNode();
p->left = pNode;
pNode->value = value;
return;
}
p = p->left;
}
else
{
if (!p->right)
{
BTreeNode *pNode = new BTreeNode();
p->right = pNode;
pNode->value = value;
return;
}
p = p->right;
}
}
}
inline int max(int a, int b){
return a > b ? a : b;
}
int height(BTreeNode *root, bool &balance){
if (!root)
{
return 0;
}
int left = height(root->left,balance);
int right = height(root->right,balance);
if (right - left < -1 || right - left > 1)
{
balance = false;
}
return max(left,right)+1;
}
int main()
{
int n;
cin >> n;
BTreeNode *root = 0;
while (n--)
{
int value;
cin >> value;
insertNode(&root,value);
}
bool flag = true;
cout << height(root,flag);
cout << (flag ? " YES" : " NO") << endl;
return 0;
}
111.二叉搜索树的功能实现
// 二叉树构造与节点结构同上
#include <iostream>
#include <queue>
using namespace std;
struct BTreeNode
{
int value;
BTreeNode *left;
BTreeNode *right;
};
void insertNode(BTreeNode **p_root, int value){
if (!*p_root)
{
*p_root = new BTreeNode();
(*p_root)->value = value;
return;
}
BTreeNode *p = *p_root;
while (p)
{
if (value == p->value)
{
return;
}
else if (value < p->value)
{
if (!p->left)
{
BTreeNode *pNode = new BTreeNode();
p->left = pNode;
pNode->value = value;
return;
}
p = p->left;
}
else
{
if (!p->right)
{
BTreeNode *pNode = new BTreeNode();
p->right = pNode;
pNode->value = value;
return;
}
p = p->right;
}
}
}
void display(queue<int> &q){
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
bool find(BTreeNode *root, int n, queue<int> q){
if (!root)
{
return false;
}
q.push(root->value);
if (n == root->value)
{
display(q);
return true;
}
else if (n < root->value)
{
if (!root->left) return false;
else return find(root->left,n,q);
}
else
{
if (!root->right) return false;
else return find(root->right,n,q);
}
}
int main()
{
int n;
cin >> n;
BTreeNode *root = 0;
while (n--)
{
int value;
cin >> value;
insertNode(&root,value);
}
cin >> n;
queue<int> q;
if(!find(root,n,q)) cout << "not find" << endl;
return 0;
}
标签:
原文地址:http://blog.csdn.net/sps900608/article/details/52250894