题目一:
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把
当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
int StepNumber(int num)
{
if (num < 0) { return 0; }
int step = 0, prev = 0, cur = 1;
while(cur <= num) {
if (prev == num || cur == num) {
return step;
}
int tmp = cur;
cur += prev;
prev = tmp;
}
return (num - prev) > (cur - num) ? (cur - num) : (num - prev);
}
int main()
{
int a = StepNumber(0);
return 0;
}
第二题:
n 只奶牛坐在一排,每个奶牛拥有 a 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿
走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
int MoveApple(int sum, vector array, bool exit_even, bool exit_uneven) {
int step = 0, average = 0;
average = sum / array.size();
if (average * array.size() != sum || (average & 1) == true && exit_even || (average & 1) == false && exit_uneven)
return -1;
for (int i = 0; i < array.size(); i++){
if (array[i] != average) {
int j = i + 1;
while (array[i] != average) {
if (array[i] < average) {
if (array[j] <= average || array[j] - 2 < average) {
++j;
continue;
}
array[j] -= 2;
array[i] += 2;
step += 1;
}
else{
if (array[j] >= average || array[j] + 2 > average) {
++j;
continue;
}
array[j] += 2;
array[i] -= 2;
step += 1;
}
}
}
}
return step;
}
int main()
{
int cow_num = 0, sum= 0;
bool exit_uneven = false, exit_even = false;
vector array;
cin >> cow_num;
for (int i = 0; i < cow_num; ++i) {
int tmp = 0;
cin >> tmp;
if (tmp & 1)
exit_uneven = true;
else
exit_even = true;
sum += tmp;
array.push_back(tmp);
}
cout << MoveApple(sum, array, exit_even, exit_uneven);
return 0;
}
第三题:
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子
向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连
续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
输入描述:
int FindGreatestSumOfSubArray(vector array) {
int max = array[0];
for (int begin = 0; begin < array.size(); begin++)
{
if (array[begin] > max)
max = array[begin];
if (array[begin] >= 0)
{
int tmp = 0;
for (int cur = begin; cur < array.size();cur++)
{
tmp += array[cur];
if (tmp < 0)
break;
else if (tmp > max)
max = tmp;
}
}
}
return max;
}
题目四:
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10
输出描述:
输出答案(YES\NO)
string CheckString(string str)
{
int once_move = 0;
size_t begin = 0;
size_t end = str.size() - 1;
while (begin < end) {
if (str[begin] != str[end]) {
if (str[begin] == str[end - 1])
--end;
else
++begin;
if (++once_move > 1) {
return "NO";
}
continue;
}
++begin;
--end;
}
return "YES";
}