neighbor
題目描述
隔壁學校地形圖可以通過一個高度矩陣表示,矩陣中每一個位置都有一個數hi , j表示這個座標的海拔,我們姑且將其稱爲海拔圖,容易發現,我們可以通過這個矩陣輕鬆算出隔壁學校的主視圖,左視圖。
相反的,我們卻不能通過主視圖和左視圖唯一確定海拔圖,現在問題來了,已知主視圖左視圖,我們需要知道剷平隔壁學校的代價上限和下限(即可能的體積最大值與最小值)
輸入
第一行兩個數 n , m (1 <=n ,m<=1000, 0<= hi ,j <= 1000), 分別表示海拔圖的長和寬。
第二行 n 個數,描述了主視圖每一個位置的高度。
第三行 m 個數,描述了左視圖每一個位置的高度
輸出
一行兩個數,分別表示代價最小值與最大值。
樣例輸入
2 2
1 1
1 1
樣例輸出
2 4
解題思路
輕院校賽當時做的時候越想越複雜,最大值比較好求。最小值的時候,考慮了各種複雜的情況,然後比較相同的時候。最後到最後都沒有過。然後看了一下題解秒懂,只需要判斷相同的時候如果那一列沒有放的話,就可以把兩個相等的放在一起,就是減掉一個相同的值,氣炸了
程序代碼
#include <stdio.h>
#include <string.h>
#define min(a,b) a<b?a:b
int main()
{
int n,m,i,j,k;
long long sum0,sum1;
int a[1010],b[1010],f[1010];
while(scanf("%d%d",&n,&m)!=EOF){
sum0=sum1=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
for(i=0;i<n;i++){
scanf("%d",&a[i]);
sum0+=a[i];
}
for(i=0;i<m;i++){
scanf("%d",&b[i]);
sum0+=b[i];
}
for(i=0;i<n;i++) //最大值就是每行每列都放上滿足的最小值
for(j=0;j<m;j++)
sum1+=min(a[i],b[j]);
for(i=0;i<n;i++){ //最小值就是橫縱都放上,然後可以重合的地方放一次就好了
for(j=0;j<m;j++){
if(a[i]==b[j]&&!f[j]){
sum0-=a[i];
f[j]=1;
break;
}
}
}
printf("%lld %lld\n",sum0,sum1);
}
return 0;
}