隔壁(贪心)

隔壁

背景:
Cax军训了,隔壁某世界二流学校开始搞事情,派遣cax军训观光团前来扰乱士气,经过严密筹划,cax决定为民除害,直接用拖拉机铲平隔壁学校。
题目描述:
隔壁学校地形图可以通过一个高度矩阵表示,矩阵中每一个位置都有一个数0≤h(i,j) ≤10^5表示这个坐标的海拔,我们姑且称之为海拔图,容易发现,我们可以通过这个矩阵轻松地算出隔壁学校的主视图,左视图,相反的,我们却不能通过主视图和左视图唯一确定海拔图,现在问题来了,已知主视图,左视图,我们需要知道铲平隔壁的代价上限与下限(即可能的体积最大值与最小值)
输入描述:
第一行两个数n,m,分别表示海拔图的长和宽
第二行n个数,描述了主视图每一个位置的高度
第二行m个数,描述了左视图每一个位置的高度
输出描述:
一行两个数,分别表示代价最小值与最大值
样例输入:
2 2
1 1
1 1
样例输出:
2 4
数据范围:
对于10%的数据,满足n=m=1
对于另外10%的数据,满足n=m=2
对于另外20%的数据,满足1≤n,m≤3且0≤h(i,j) ≤3
对于100%的数据,满足1≤n,m≤1000且0≤h(i,j) ≤1000

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1010;
int n,m,l[maxn],d[maxn];
bool flag[maxn];
int min_ans()
{
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        bool can=0;
        for(int j=1;j<=m;j++)
        if(l[i]==d[j]&&!flag[j])
        {
            ans+=l[i];
            flag[j]=1;
            can=1;
            break;
        }
        if(!can)
        ans+=l[i];
    }
    for(int i=1;i<=m;i++)
    if(!flag[i])
    ans+=d[i];
    return ans;
}
int max_ans()
{
    int ans=0;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
      ans+=min(l[i],d[j]);
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>l[i];
    for(int i=1;i<=m;i++)
    cin>>d[i];
    cout<<min_ans()<<" "<<max_ans();
    return 0;
}
posted @ 2016-10-05 11:45  抽空的太阳  阅读(131)  评论(0编辑  收藏  举报