关闭

【TYVJ】1094 矩形分割

标签: TYVJ矩形分割贪心水题
203人阅读 评论(0) 收藏 举报
【解析】

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

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

<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>


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52242次
    • 积分:1889
    • 等级:
    • 排名:千里之外
    • 原创:137篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论