牛牛的消消乐
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M 热度指数:16958
本题知识点: 数组 数学
题目描述
给定一个数组 nums,其中有 n 个非负整数。你的目的是进行两次操作,使得数组的元素之和最小。每次操作形如:任选一个整数 x ,将数组中所有大于等于 x 的数减去 x 。示例1输入复制[2,1,3]返回值复制0说明初始数组为 [2, 1, 3]。先选择 x = 2,则所有大于等于 2 的元素减去 2 ,变成 [0, 1, 1]。再选择 x = 1,则所有大于等于 1 的元素减去 1 ,变成 [0, 0, 0]。所以数组元素之和的最小值为 0。
#include
#include
using namespace std;
const int N = 3001;
void bfs(int arr[N], int n, int m){
//第二次结束 数组统计总和
if (m == 2)
{
int sum = 0;
for (int i = 0; i < n; i++)
sum = sum + arr[i];
cout << sum << endl;
return;
}
int aver = 0;
int pex = -1;
int minaver = 9999999;
int zero = 0;
//统计每一次数组总和
for (int i = 0; i < n; i++)
{ aver = aver + arr[i];
//计算每次数组中值为0的个数
if (arr[i] == 0)
{ zero++; }
}
//统计每次不为0的数组的平均值
aver = aver / (n-zero);
for (int i = 0; i < n; i++)
{
//遍历每一个数值与平均值的最小差
int tempt = abs(aver - arr[i]);
if (tempt < minaver)
{ pex = i; minaver = tempt;
}
}
//取出与平均值的最小差 的数组值
int x = arr[pex];
for (int i = 0; i < n; i++)
{
//大于等于X的数组值 则进行与X进行相减
if (arr[i] >= x)
arr[i] -= x;
}
//再次进行深度遍历
bfs(arr, n, m + 1);}
int main()
{
int n;
cin >> n;
int arr[N] = { 0 };
//输入数组值
for (int i = 0; i < n; i++)
{ cin >> arr[i]; }
//调用遍历函数
bfs(arr, n, 0);
return 0;}