LA4636积木艺术

题意:
      有一些1*1*1的单位正方体积木,现在要摆积木,每一块积木有两种方法,要么放在地面上,要么放在别的积木的正上方,现在给你摆好积木的正面图和侧面图,问你最少用了多少块积木。


思路:
      比较有意思也比较容易想到,而且题目中给的几个图看完估计就能想到怎么做了,光看文字的时候第一组测试数据我都没模拟过去,哎!看完图会发现一个问题,假如我们看正面图,我们看到的是一组连续的,但是在实际情况下他们有可能不连续,我说的不连续是指前后的不连续,至于是什么顺序,可以使任意顺序,任意顺序?越乱的东西越要简单想,那么也就是说我们根本不用考虑他的顺序,我们只要根据最优解随意改变他的顺序就行了,怎么样才是最优?题目要求是少的积木,那么首先正面的这些全要有,侧面呢?能没有就没有,怎么样才能没有呢?只有正面出现一个和他等高的,那么我们就直接用那个等高的去替换他就行了,但是注意一点,一个只能替换一个,如果没得替换的,那么就把当前高度加到答案里就行了,还有这个题目用谁去替换谁答案都是一样的,因为正视图和侧视图本来就是相对而言的。




#include<stdio.h>
#include<string.h>


int main ()
{
   int n ,m ,i ,a ,Ans;
   int mark[25];
   while(~scanf("%d %d" ,&n ,&m) && n + m)
   {
      memset(mark ,0 ,sizeof(mark));
      Ans = 0;
      for(i = 1 ;i <= n ;i ++)
      {
         scanf("%d" ,&a);
         Ans += a;
         mark[a] ++;
      }
      for(i = 1 ;i <= m ;i ++)
      {
         scanf("%d" ,&a);
         if(mark[a]) mark[a] --;
         else Ans += a;
      }
      printf("%d " ,Ans);
   }
   return 0;






原文地址:https://www.cnblogs.com/csnd/p/12062667.html