zoukankan      html  css  js  c++  java
  • 某易笔试题之搬砖简单解法

    题目内容:

        给定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 }
  • 相关阅读:
    [题解] LuoguP1587 [NOI2016]循环之美
    [题解] LuoguP3705 [SDOI2017]新生舞会
    [题解] LuoguP3702 [SDOI2017]序列计数
    [题解] LuoguP6476 [NOI Online 2 提高组]涂色游戏
    [题解] LuoguP4240 毒瘤之神的考验
    [题解] LuoguP6156简单题
    [题解] LuoguP6055 [RC-02] GCD
    [题解] LuoguP5050 【模板】多项式多点求值
    AtCoder Grand Contest 028题解
    Codeforces Round #421 (Div. 1) 题解
  • 原文地址:https://www.cnblogs.com/rongfangliu/p/6617621.html
Copyright © 2011-2022 走看看