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);
}
posted @ 2016-11-15 20:26  keshuqi  阅读(219)  评论(0编辑  收藏  举报