某易笔试题之搬砖简单解法
Posted 柳如风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了某易笔试题之搬砖简单解法相关的知识,希望对你有一定的参考价值。
题目内容:
给定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 }
以上是关于某易笔试题之搬砖简单解法的主要内容,如果未能解决你的问题,请参考以下文章