1.分苹果
n 只奶牛坐在一排,每个奶牛拥有 a i a_i ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 a i a_i ai(1 <= a i a_i ai <= 100)。
输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
示例1
输入
4
7 15 9 5
输出
3
苹果总数不能被均分时,不成立
平均数减去每头牛的苹果数不是二的倍数时,不成立
最后只需要记录苹果数小于平均数的牛的移动次数即可
#include <iostream>
using namespace std;
int a[105];
int main(void)
{
int n, ave = 0, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> a[i];
ave += a[i];
}
bool flag = 1;
if (ave % n != 0)
flag = 0;
else{
ave /= n;
for (int i = 1; i <= n; i++){
int d = ave - a[i];
if (d % 2 != 0)
flag = 0;
else if (d > 0)
ans += d / 2;
}
}
if (flag)
cout << ans << endl;
else
cout << "-1" << endl;
return 0;
}
2.拼凑面额
给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。
链接:https://www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93?orderByHotValue=0&commentTags=Python
来源:牛客网
输入描述:
输入为一个数字N,即需要拼凑的面额
输出描述:
输出也是一个数字,为组成N的组合个数。
示例1
输入
5
输出
2
完全背包求组合数问题,一般是将max改为相加即可。
当组成5000时,答案会超出int,需要设为long long。
dp[i][j]表示用前i种纸币来组成j,记得要将dp[0][0]初始化为1。
#include<stdio.h>
int w[]={
1,5,10,20,50,100};
long long dp[10][10005];
int main(void)
{
int W;
scanf("%d",&W);
dp[0][0]=1;
for(int i=0;i<6;i++)
for(int j=0;j<=W;j++)
{
if(j<w[i])
dp[i+1][j]=dp[i][j];
else
dp[i+1][j]=dp[i][j]+dp[i+1][j-w[i]];
}
printf("%lld\n",dp[6][W]);
return 0;
}
3.矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
链接:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
来源:牛客网
在牛客上找到的题解,讲解的很清楚,这道题就是斐波那契。
4.连续子数组的最大和
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
链接:https://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484
来源:牛客网
class Solution {
public:
int res = -0x3f3f3f3f, maxv = -0x3f3f3f3f;
int FindGreatestSumOfSubArray(vector<int> array) {
int n = array.size();
for (int i = 0; i < n; i++){
if (maxv >= 0)
maxv += array[i];
else
maxv = array[i];
res = max(res, maxv);
}
return res;
}
};
5.斐波那契凤尾
NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。
链接:https://www.nowcoder.com/questionTerminal/c0a4b917a15f40a49ca10532ab9019fb?orderByHotValue=1&pos=1
来源:牛客网
输入描述:
输入有多组数据。每组数据一行,包含一个整数n (1≤n≤100000)。
输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。
示例1
输入
1234100000
输出
1235537501
WA到自闭的一道题,一看是斐波那契,就没仔细看,没想到这题暗藏玄机啊
#include<stdio.h>
int n,t,arr[100005];
int main(void)
{
arr[1]=1;arr[2]=2;
for(int i