【题目】
题目描述:
有一个 的矩形木板。你需要把这个木板切成
的小方块,也就是竖着切
刀、横着切
刀。横着切第
个位置的权值为
,竖着切第
个位置的权值为
。切某一刀时的费用为切这一刀的权值乘上切过的块数。
请你安排切的顺序使得所有费用之和最小。
输入格式:
第一行两个数 ,
。
接下来一行 个整数
,
,…,
。
接下来一行 个整数
,
,…,
。
输出格式:
输出一个数,表示最小的费用之和
。
样例数据:
输入
6 4 2 1 3 1 4 4 1 2
输出
42
备注:
【数据规模与约定】
对于 30% 的数据, ≤ 10 。
对于 60% 的数据, ≤ 500 。
对于 100% 的数据, 2 ≤ ≤
;0 ≤
≤
。
【提醒】
建议本题加读入优化。
【分析】
就是贪心+模拟吧,应该不是很难
【代码】
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define mod 1000000007
using namespace std;
int Read()
{
int x=0;
char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x;
}
int x[N],y[N];
bool cmp(int a,int b) {return a>b;}
int main()
{
// freopen("cutboard.in","r",stdin);
// freopen("cutboard.out","w",stdout);
int m,n,i,j,ans=0;
m=Read(),n=Read();
//scanf("%d%d",&m,&n);
for(i=1;i<m;++i) x[i]=Read(); //scanf("%d",&x[i]);
for(i=1;i<n;++i) y[i]=Read(); //scanf("%d",&y[i]);
sort(x+1,x+m,cmp),sort(y+1,y+n,cmp);
i=1,j=1;
while(i<m&&j<n)
{
if(x[i]>y[j]) ans=(ans+1ll*x[i++]*j)%mod;
if(x[i]<=y[j]) ans=(ans+1ll*y[j++]*i)%mod;
}
while(i<m) ans=(ans+1ll*x[i++]*n)%mod;
while(j<n) ans=(ans+1ll*y[j++]*m)%mod;
printf("%d",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}