LA4636积木艺术

时间:2024-09-16 22:33:38

题意:

      有一些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\n" ,Ans);

   }

   return 0;