zzuli 2263 neighbor(貪心)

neighbor

zzuli2263

題目描述

隔壁學校地形圖可以通過一個高度矩陣表示,矩陣中每一個位置都有一個數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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章