鉴于河南是oi弱省,所以想来这道题也没什么人会翻出来写吧,而且这还是haoi2009的一道简单题目,所以估计也没几个人会写博客的,那么看在我这么弱的份上,我觉得是应该写一篇出来的。
这道题我是按照贪心写的(毕竟被划在贪心题中了),解题思想在于从大到小排列所有代价,别管是横着还是竖着,都是要排的,但横竖又是必不可少的,所以我们用一个结构体来记录代价和这个代价到底是横着切的还是竖着切的。用一个数组c[2]来分别记录横着切了几次和竖着切了几次,然后就是相乘后累加,关于这个,建议还是推一遍样例为好。
下面发代码:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <functional>
using namespace std;
int n,m,i,ans;
int c[2];
struct lp
{
int v;
int c;
}a[20086];
bool cmp(lp a,lp b)
{return a.v>b.v;}
int main()
{
cin>>n>>m;
n--;m--;
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{cin>>a[i].v,a[i].c=0;}
for(i=n+1;i<=n+m;i++)
{cin>>a[i].v,a[i].c=1;}
sort(a+1,a+n+m+1,cmp);
for (i=1;i<=n+m;i++)
{
c[a[i].c]++;
if(a[i].c==0)
ans+=a[i].v*(c[1]+1);
if(a[i].c==1)
ans+=a[i].v*(c[0]+1);
}
cout<<ans<<endl;
return 0;
}