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

题目内容:

    给定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 }

 

posted @ 2017-03-25 16:57  柳如风  阅读(290)  评论(0编辑  收藏  举报
https://www.vultr.com/?ref=7677570