某易笔试题之搬砖简单解法

题目内容:

给定n块砖,每块砖有不同的厚度,希望用这些砖堆两个高度相同的塔,使堆出来的高度尽量高,能否实现呢?

输入

输入包括两行:

第一行为一个整数n(0<=n<=50),一共有n块砖

第二行为n个整数,代表每块砖的厚度h[i](1<=h[i]<=500000)

输出

如果可以堆出两座相同高度的塔,输出最高能拼凑的高度,如果不能则输出-1

一种可行的解

  将输入排序,得到两组和差不多大的数,然后做差,寻找能弥补差的数,找不到则结束,判断输出是否相等即可。

  1 /*
  2 给定<50块砖,不同高度,堆尽可能高尽可能接近高度的两座塔
  3 输入文件两行:第一行: 砖数,第二行:砖厚0 砖厚1 ...
  4 */
  5 #include <stdio.h>
  6
  7 void sort(int *a,int n)
  8 {
  9     int i,j,k,temp;
 10
 11     for(i=0;i<n-1;i++)
 12     {
 13         k=i; /*给记号赋值*/
 14         for(j=i+1;j<n;j++)
 15             if(a[k]>a[j ]) k=j; /*是k总是指向最小元素*/
 16         if(i!=k)/*当k!=i是才交换,否则a[i ] 即为最小*/
 17         {
 18             temp=a[i ];
 19             a[i ]=a[k];
 20             a[k]=temp;
 21         }
 22     }
 23 }
 24
 25 int sum(int *a, int n)
 26 {
 27     int i;
 28     int temp = 0;
 29     for (i = 0; i<n; i++)
 30     {
 31         temp += a[i];
 32     }
 33
 34     return temp;
 35 }
 36
 37 void main()
 38 {
 39     int i;
 40     int n;
 41     int a[50];
 42
 43     //freopen("test.txt","r",stdin);    //for debug local
 44     scanf("%d", &n);
 45     for (i = 0; i<n; i++)
 46     {
 47         scanf("%d", &a[i]);
 48     }
 49
 50     if (sum(a, n) % 2 != 0)
 51         printf("-1");
 52
 53     sort(a, n);    //升序排序
 54
 55     int b[50], c[50];
 56     int len_b = n/2, len_c = n/2;
 57     for (i = 0; i<n/2; i++)    //分成两堆尽可能接近的砖
 58     {
 59         b[i] = a[2*i];
 60         c[i] = a[2*i+1];
 61     }
 62     if (n%2 != 0)    //奇数个,最后一个加入b
 63     {
 64         b[i] = a[n-1];
 65         len_b++;
 66     }
 67
 68     int sum_a, sum_b, diff, temp;
 69     int find = 1, j = 0;
 70     int abigb = 0;    //1:b>c,0:b<c
 71     while(find)
 72     {
 73         sum_a = sum(b, len_b);
 74         sum_b = sum(c, len_c);
 75         abigb = (sum_a > sum_b)?1:0;
 76         diff = abigb?(sum_a-sum_b):(sum_b-sum_a);
 77         find  = 0;
 78         if (abigb)
 79         {
 80             temp = 0;
 81             //找到小于diff的最大数
 82             for (i = 0; i<len_b; i++)
 83             {
 84                 if (b[i] < diff && b[i] > temp)
 85                 {
 86                     temp = b[i];
 87                     j = i;
 88                     find  = 1;
 89                 }
 90             }
 91             //找到
 92             if (find == 1)
 93             {
 94                 c[len_c] = b[j];len_c++;
 95                 b[j] = b[len_b - 1];len_b--;
 96             }
 97         }
 98         else
 99         {
100             temp = 0;
101             //找到小于diff的最大数
102             for (i = 0; i<len_c; i++)
103             {
104                 if (c[i] < diff && c[i] > temp)
105                 {
106                     temp = c[i];
107                     j = i;
108                     find  = 1;
109                 }
110             }
111             //找到
112             if (find == 1)
113             {
114                 b[len_b] = c[j];len_b++;        //搬移最小的
115                 c[j] = c[len_c - 1];len_c--;
116             }
117         }
118     }
119
120     if (sum_a == sum_b)
121         printf("%d", sum_a);
122     else
123         printf("-1");
124 }
时间: 2024-07-31 06:15:28

某易笔试题之搬砖简单解法的相关文章

2015考研 杭电 计算机学院 复试笔试题第一题 JAVA语言解法

杭电 2015年考研 计算机学院 复试笔试第一题 JAVA解法 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 杭电2015年 计算机学院 复试 笔试题第一题 JAVA解答 * author 刘汪洋 QQ 605283073 * 求出:字符串如:"34223abd#34SB-11--" * 中整数的和 其中-在数字前表示负号,否则为字符 */ pub

阿里巴巴2014笔试题详解(9月22北京)(转)

转:http://blog.csdn.net/zs634134578/article/details/21101971 第一部分  单选题(前10题,每题2分:后10题,每题3分.选对得满分,选错倒扣1分,不选得0分) 1.一次内存访问,SSD硬盘访问和SATA硬盘随机访问的时间分别是() A.几微秒,几毫秒,几十毫秒     B.几十纳秒,几十毫秒,几十毫秒 C.几十纳秒,几十微秒,几十毫秒 D.几微秒,几十微秒,几十毫秒 解析:内存访问速度通常在50ns到80ns范围内,SSD硬盘的访问速度

一道简单的 Java 笔试题,但值得很多人反思

面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了.至于其它能力.综合水平,由别人把关.为此,在挑选唯一的一道笔试题时,我特别地上心. 首先,我不敢用网上那些广为流传的,比如Leetcode.<程序员面试宝典>里的题——这些都太难了!正儿八经做,其实很少有人能在1小时内完美做出来,除非之前遇

js+html+css实现简单页面交互功能(2015知乎前端笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2 密码:hellozhihu

10道C++输出易错笔试题收集(敢进来挑战吗?)

下面这些题目都是我之前准备笔试面试过程中积累的,大部分都是知名公司的笔试题,C++基础薄弱的很容易栽进去.我从中选了10道简单的题,C++初学者可以进来挑战下,C++大牛也可以作为娱乐玩下(比如下面的第6题).为了便于大家思考,将题目与答案分开,不过无论题目本身如何,我觉得后面的解析过程更值得学习,因为涉及很多我们学习C++过程中必知必会的小知识点 . 第一部分:题目 如下函数,在32 bit系统foo(2^31-3)的值是:() int foo(int x) { return x&-x; }

10道C++输出易错笔试题收集

下面这些题目都是我之前准备笔试面试过程中积累的,大部分都是知名公司的笔试题,C++基础薄弱的很容易栽进去.我从中选了10道简单的题,C++初学者可以进来挑战下,C++大牛也可以作为娱乐玩下(比如下面的第6题).为了便于大家思考,将题目与答案分开,不过无论题目本身如何,我觉得后面的解析过程更值得学习,因为涉及很多我们学习C++过程中必知必会的小知识点 . 第一部分:题目 如下函数,在32 bit系统foo(2^31-3)的值是:() int foo(int x) { return x&-x; }

python 饥饿的小易(网易笔试题)

本周早些时候,学弟给我发了一道网易的笔试题,饥饿的小易,感觉有点意思-分享给大家 题目描述: 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者c.因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次.贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等).小易需要你帮忙计算最少需要

[笔试题]sizeof系列面试题中的易错之处

sizeof系列笔试题看似简单,其实如果不深入探究,很容易出错,本人就有时败在了这,特写篇博客总结一番,引以为戒. V1.0 32位和64位编译器的区别 测试代码如下: #include "stdafx.h" #include <iostream> using namespace std; int main() { //32和64位编译器区别: 除了*与long随操作系统子长变化而变化外,其他的都固定不变(32位和64相比) //32: sizeof(*)=4 sizeof

告诉我图样图森破的两道简单C++笔试题

今晚刷了一大堆的笔试题,中规中矩,但是有两道做得很快但是都错了的题目,印象深刻. (要找工作的大四渣有没有共鸣,在学校明明很努力,但是总是跟不上时代,没有厉害的项目,也没有过人的竞赛成绩,内推屡屡失败,前天阿里巴巴在线笔试也被虐死,真心迷惘,唯独刷题搞笔试了.) 第一道题是关于宏定义的. #include<iostream> using namespace std; #define fun(n) (n-1)*n int main() { int x=3; cout<<fun(x+3