题意:已知前视图和右视图,求最少需要几个正方体以及至多可以再增加几个正方体。
分析:先对于最小木块数,要想用最少的立方体搭建,那就意味着前视图中的每一竖立方体的高度最好都要被右视图中的高度所利用到。所以我们以正视图为基准,正视图需要的立方体总数加上侧视图存在无法利用正视图的数量,就是最少需要的立方体数。其次对于最大木块数,我们可以发现,对于每个位置,我们可以放最小的那个高度都不影响前视图和右视图。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 int k,a[10],b[10],n[10],m[10]; 9 10 int main() 11 { 12 int t; 13 scanf("%d",&t); 14 while(t--) 15 { 16 memset(a,0,sizeof(a)); 17 memset(b,0,sizeof(b)); 18 scanf("%d",&k); 19 int tmp; 20 for(int i=0;i<k;++i) 21 { 22 scanf("%d",&n[i]); 23 a[n[i]]++; 24 } 25 for(int i=0;i<k;++i) 26 { 27 scanf("%d",&m[i]); 28 b[m[i]]++; 29 } 30 int Min=0; 31 int Max=0; 32 for(int i=0;i<10;++i) 33 Min+=max(a[i],b[i])*i; 34 for(int i=0;i<k;++i) 35 for(int j=0;j<k;++j) 36 Max+=min(n[i],m[j]); 37 printf("Matty needs at least %d blocks, and can add at most %d extra blocks. ", Min,Max-Min); 38 } 39 return 0; 40 }