Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) C. Fillomino 2

题目大意:给出矩阵的主对角线元素,使得每个元素在主对角线下的区域进行延伸(比如元素为x,则该区域有 x 个 x 连通)。问是否有这样的区域,有则输出,没有则输出-1。

思路:首先,一定是有符合题目条件的区域的,因为一共有元素\frac{(1+n)*n}{2}个。所以现在只需进行构造,可以发现,从第一个元素开始,尽可能向左进行延伸,如果不能延伸就向下进行延伸是可以构造出符合题目条件的区域。要不然就是尽可能向下延伸,不能向下的话就向左进行延伸。确保每一个位置都不会被落下。

一开始用贪心写,写着写着发现每个位置是要不断更新的,我是菜逼。

用dfs就能很快实现啦!(~)

AC:

#include<stdio.h>
int n;
int a[505][505];
int c[505];
void dfs(int x,int y,int k)
{
	if(c[k]<1) return ;
	if(!a[x][y-1] && y-1>=1) //向左延伸
	{
		a[x][y-1]=a[k][k];
		c[k]--;
		dfs(x,y-1,k);
	}
	else if(!a[x+1][y] && x+1<=n)//向右延伸
	{
		a[x+1][y]=a[k][k];
		c[k]--;
		dfs(x+1,y,k);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i][i]);
		c[i]=a[i][i]-1;//剩余个数;
	}
	for(int i=1;i<=n;i++)
	{
		dfs(i,i,i);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

才发现同一份代码用不同的语言交,时间是不一样的吼,,,

Σ(っ °Д °;)っ C选手枯了。。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值