【2018/09/15测试T2】【SOJ 1805】切木板

【题目】

题目描述:

有一个 m\times n 的矩形木板。你需要把这个木板切成 1\times 1 的小方块,也就是竖着切 n-1 刀、横着切 m-1 刀。横着切第 i 个位置的权值为 x_{i} ,竖着切第 j 个位置的权值为 y_{j} 。切某一刀时的费用为切这一刀的权值乘上切过的块数。

请你安排切的顺序使得所有费用之和最小。

输入格式:

第一行两个数 mn 。
接下来一行 m-1 个整数 x_{1}x_{2},…,x_{m-1} 。
接下来一行 n-1 个整数 y_{1}y_{2},…,y_{n-1} 。

输出格式:

输出一个数,表示最小的费用之和 mod  10^{9}+7 。

样例数据:

输入

6 4
2 1 3 1 4
4 1 2

输出

42

备注:

【数据规模与约定】
对于 30% 的数据, m+n ≤ 10 。
对于 60% 的数据, m , n ≤ 500 。
对于 100% 的数据, 2 ≤ m,n ≤ 10^{6} ;0 ≤ x_{i},y_{j} ≤ 10^{9} 。

【提醒】
建议本题加读入优化。

 

【分析】

就是贪心+模拟吧,应该不是很难

 

【代码】

#include
#include
#include
#include
#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;iy[j])  ans=(ans+1ll*x[i++]*j)%mod;
		if(x[i]<=y[j])  ans=(ans+1ll*y[j++]*i)%mod;
	}
	while(i

 

你可能感兴趣的:(#,模拟,#,贪心)