题意:
有一些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;
}