NOIP模拟赛 隔壁

时间:2023-12-19 17:25:44

问题描述:

隔壁学校地形图可以通过一个高度矩阵表示,矩阵中每一个位置都有一个数0<=hij<=10^5表示这个坐标的海拔,我们姑且将其称为海拔图,容易发现,我们可以通过这个矩阵轻松算出隔壁学校的主视图,左视图。
    相反的,我们却不能通过主视图和左视图唯一确定海拔图,现在问题来了,已知主视图左视图,我们需要知道铲平隔壁学校的代价上限和下限(即可能的体积最大值与最小值)

输入:

第一行两个数n,m,分别表示海拔图的长和宽。
第二行n个数,描述了主视图每一个位置的高度。
第三行m个数,描述了左视图每一个位置的高度

输出:

一行两个数,分别表示代价最小值与最大值。

样例输入:


样例输出:

 

样例解释:

最大最小值对应的海拔图分别为:
1 1
1 1

1 0
0 1

数据范围:

对于10%的数据,满足n=m=1
对于10%的数据,满足n=m=2
对于另外20%的数据,满足1<=n,m<=3且0<=hij<=3
对于100%的数据,满足1<=n,m<=1000,且0<=hij<=1000

题解:水题,搞一搞就可以了

#include<stdio.h>
#include<string.h>
#define buf 1001
inline int dmin(int x,int y){
if(x<y)
return x;
return y;
}
inline void F(int &x){
x=;int c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))
f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
x*=f;
}
long long mxn,mnn;
int n,m,c[buf],l[buf],t[buf];
int main(){
freopen("neighbor.in","r",stdin),
freopen("neighbor.out","w",stdout);
F(n),
F(m);
for(int i=;i<=n;i++)
F(c[i]),
mnn+=c[i],
t[c[i]]++;
for(int j=;j<=m;j++){
F(l[j]);
if(t[l[j]])
t[l[j]]--;
else mnn+=l[j];
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
mxn+=dmin(c[i],l[j]);
printf("%I64d %I64d\n",mnn,mxn);
fclose(stdin),
fclose(stdout);
}