SMIAMS

宝剑锋从磨砺出,梅花香自苦寒来!

【TYVJ】1094 矩形分割

【解析】

由于每行每列都要取一次,为了使结果最小,越大的数被分割的次数应该越少。

所以按照数值从大到小排序,然后枚举并维护出现了几次。

<span style="font-size:18px;">#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int N=2140;

//0,n:行		1,m:列 
int n,m,c[2][N],v[2][N];
struct Q
{
	int k,id,w;
}q[N];
int res;

inline int read(void)
{
	int s=0,f=1; char c=getchar();
	for (;c<'0'||c>'9';c=getchar()) if (c=='-') f=-1;
	for (;'0'<=c&&c<='9';c=getchar()) s=(s<<1)+(s<<3)+c-'0';
	return s*f;
}

inline int cmp(Q qa,Q qb)
{
	return qa.w>qb.w;
}

int main(void)
{
	n=read(),m=read();
	for (int i=1;i<n;i++) c[0][i]=read();
	for (int i=1;i<m;i++) c[1][i]=read();
	
	for (int i=1;i<n;i++) q[i].id=i,q[i].w=c[0][i];
	for (int i=1;i<m;i++) q[i+n-1].k=1,q[i+n-1].id=i,q[i+n-1].w=c[1][i];
	sort(q+1,q+n+m-1,cmp);
	
	int cc;
	for (int i=1;i<=n+m-2;i++)
	{
		cc=1;
		if (!q[i].k)
		{
			for (int j=1;j<m;j++) cc+=v[1][j];
			v[0][q[i].id]=1;
		}
		else
		{
			for (int j=1;j<n;j++) cc+=v[0][j];
			v[1][q[i].id]=1;
		}
		res+=cc*q[i].w;
	}
	printf("%d\n",res);
	
	return 0;
}</span>


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013598409/article/details/46820989
上一篇【TYVJ】1024 外星人的密码数字
下一篇【BZOJ】1003 Cards
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭