NOIP模拟赛 隔壁
问题描述:
隔壁学校地形图可以通过一个高度矩阵表示,矩阵中每一个位置都有一个数0<=hij<=10^5表示这个坐标的海拔,我们姑且将其称为海拔图,容易发现,我们可以通过这个矩阵轻松算出隔壁学校的主视图,左视图。
相反的,我们却不能通过主视图和左视图唯一确定海拔图,现在问题来了,已知主视图左视图,我们需要知道铲平隔壁学校的代价上限和下限(即可能的体积最大值与最小值)
输入:
第一行两个数n,m,分别表示海拔图的长和宽。
第二行n个数,描述了主视图每一个位置的高度。
第三行m个数,描述了左视图每一个位置的高度
输出:
一行两个数,分别表示代价最小值与最大值。
样例输入:
2 2 1 1 1 1
样例输出:
2 4
样例解释:
最大最小值对应的海拔图分别为:
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=0;int c=getchar(),f=1; for(;c<48||c>57;c=getchar()) if(!(c^45)) f=-1; for(;c>47&&c<58;c=getchar()) x=(x<<1)+(x<<3)+c-48; 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=1;i<=n;i++) F(c[i]), mnn+=c[i], t[c[i]]++; for(int j=1;j<=m;j++){ F(l[j]); if(t[l[j]]) t[l[j]]--; else mnn+=l[j]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mxn+=dmin(c[i],l[j]); printf("%I64d %I64d\n",mnn,mxn); fclose(stdin), fclose(stdout); }