首页 > 试题广场 >

砌墙

[编程题]砌墙
  • 热度指数:571 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
NowCoder喜欢玩他的方盒子。他把那些盒子叠成不同高度的柱子,他对姐姐说:“看,我砌成了一堵墙!” “你只有把所有的柱子调整成相同的高度,那样才算是一堵真正的墙。”她回应道。经过短暂的思考,NowCoder觉得她是对的。为了使栈能一样高,他只好一个一个地搬盒子。但是他很懒,想搬最小的次数来达到目的。你能帮助他吗?

输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤50),代表柱子的个数。

第二行包含n个正整数h,表示每根柱子的高度。


输出描述:
对应每组数据,输出一个整数,表示需要搬的最小次数。
示例1

输入

6
5 2 4 1 7 5

输出

5
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			int[] arr = new int[n];
			int sum = 0;
			for (int i = 0; i < n; i ++ ) {
				arr[i] = sc.nextInt();
				sum += arr[i];
			}
			int avg = sum / n;
			int count = 0;
			for (int i = 0; i < arr.length; i ++ ) {
				if(arr[i] < avg) count += avg - arr[i];
			}
			System.out.println(count);
		}
	}
}

发表于 2016-10-13 18:55:05 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int *s=new int[n];
        int ma=0;
        for(int i=0;i<n;i++)
        {
            cin>>s[i];
            ma+=s[i];
        }
        int avr;
        avr=ma/n;
        int k=0;
        for(int j=0;j<n;j++)
        {
            if(s[j]>avr)
            {
                k+=s[j]-avr;
            }
        }
        cout<<k<<endl;
    }
}

发表于 2018-09-06 16:31:44 回复(0)

python 解法

思路:把数组里面所有小于平均数的元素,用平均数减去它,就是需要搬的次数,把这些结果加起来即可

核心代码只需要三行


while True:
    try:
        a, b = input(), list(map(int, input().split()))
        height = sum(b) // len(b)
        print (sum(map(lambda c: height-c if c < height else 0, b)))
    except:
        break
发表于 2017-11-16 18:42:06 回复(0)
2,3,4,4,5 用你们的思路跑出来是啥
发表于 2022-03-07 09:55:42 回复(0)
#include <stdio.h>

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        int height[50] = {0};
        int average, sum = 0, cnt = 0;
        for(int i = 0; i < n; ++i) {
            scanf("%d", &height[i]);
            sum += height[i];
        }
        average = sum / n;
        for(int i = 0; i < n; ++i)
            if(height[i] > average)
                cnt += height[i] - average;
        printf("%d\n", cnt);
    }
    return 0;
}

发表于 2018-02-15 13:20:10 回复(0)
#include<stdio.h>
#define N 50
int main()
{
    int n;
    int num[N];
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        int sum = 0;
        int avg = 0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&num[i]);
            sum+=num[i];
        }
        avg = sum/n;
        int step = 0;
        for(int i=0;i<n;i++)
        {
            if(num[i]-avg>0)
            {
                step+=num[i]-avg;
            }
        }
        printf("%d\n",step);
    }
    return 0;
}
求平均高度和差距............
发表于 2016-08-06 09:28:13 回复(0)
只有是平均数才会一样高,所以就先求出它的平均数,比如2和8的平均数是5,只需移动3次就够了,所以应该把它们的差值的绝对值都加起来除以2。

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()){
			
			int N = sc.nextInt();
			int [] arr = new int [N];
			int sum = 0;
			
			for (int x = 0; x < N; x++){
				arr[x] = sc.nextInt();
				sum += arr[x];
			}
			
			int ave = sum / N;
			int count = 0;
			
			for (int x = 0; x < N; x++){ count += Math.abs(ave-arr[x]); }
			
			System.out.println(count /2); }
		
		sc.close();
	}

}  

发表于 2016-07-02 18:36:10 回复(0)
题目有瑕疵,首先应该要考虑是否能形成一堵墙,既然题目已经出了,一定是对测试用例进行过处理了。该题求移动的最小次数其实就是求各个柱子的高度和平均高度之间的绝对差值,然后对差值除以2,因为只需将高于平均值的差额移动到低于平均差值的柱子上即可。

#include <iostream>

using namespace std;

int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        int num[50], sum=0, avg, count=0;
        for(int i=0; i<n; i++){
            cin>>num[i];
            sum += num[i];              
        }
        avg = sum/n;
    
        for(int j=0; j<n; j++){
            count = count + abs(num[j] - avg);
        }   
        cout<<count/2<<endl;
    }
    return 0;
}
发表于 2016-06-30 14:50:43 回复(0)
#include<stdio.h>
#include<string.h>

int i,j;

void solve(int a[],int n,int count,int avg)
{
int temp=0;
for(i=0;i<n;i++)
{
while(a[i]>avg)
{
temp++;
a[i]--;
}
}
for(i=0;i<n;i++)
{
while(a[i]<avg)
{
a[i]++;
temp--;
count++;
}
}
printf("%d",count);
}

int main()
{
int a[50]={0};
int n;
int num=100;
while(scanf("%d",&n))
{
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
int avg=sum/n;//柱子均高
//msort(a,n);
solve(a,n,0,avg); 
memset(a,0,sizeof(a));
printf("\n");
num--;
if(num<0)break;
}
return 0;
}


算是比较水的题目吧,有一点不懂得事是如何同时输入多组数据?我这是用num写的假的输入多组数据
发表于 2016-04-05 20:17:36 回复(0)

问题信息

难度:
9条回答 7209浏览

热门推荐

通过挑战的用户

查看代码