HDOJ 3682 To Be an Dream Architect

原创 2016年08月28日 18:19:30

HDOJ 3682


一个相当于暴力的好题:有点容斥原理的意思

题意:n*n*n的一个正方体,每次可以拿掉一个1*1*n的柱子,问拿掉m个这样的柱子后,总共取掉了多少个小方块


想法:首先是对输入的柱子所在平面进行记录

注意的是,这个题需要判重,即有可能输入的是已经拿走的柱子


我们先处理xz平面和yz平面上的小方块,并且对xy平面的柱子进行记录

在相同的z平面的高度上,每插入一个xz的柱子,如果有相同高度的yz柱子存在,那么说明有一个重复的

所以呢,我们需要记录在xz平面上,x=x0,z=z0这个柱子是否拿掉过

而且,需要记录在z=z0这个平面上,有多少条x的柱子存在

那么在z=z0这个平面上,有y=y0的柱子出现的时候,那么答案是需要用容斥来减掉的


当xz和yz平面处理好了之后,我们来处理xy方向的柱子

可以想象成一个一个竖直的柱子往正方体从上往下插入

那么,可以枚举每一个z的高度

如果在xz平面上和yz平面上,这个xyz小方块没有被拿走的话,需要拿走

再次提醒,注意判重


另外,一个针对这个题的小技巧在这里说下:读入数据是怎么读

因为固定的字母是XYZ和=和,

那么我们不需要去用麻烦的字符串处理

用getchar()绕过这些没有意义的字符

然后用读取整数的方法得到两个数值


代码如下:

#include<bits/stdc++.h>
using namespace std;

const int maxn=1050;
int t,n,m;
int yz[maxn][maxn],xz[maxn][maxn];
int ans,tot;

struct node{
	int x,y;
}a[maxn];

int cmp(node m,node n){
	if (m.x==n.x) return m.y<n.y;
	return m.x<n.x;
}

int main(){
	//freopen("input.txt","r",stdin);
	scanf("%d",&t);
	while(t--){
		tot=ans=0;
		memset(yz,0,sizeof(yz));
		memset(xz,0,sizeof(xz));
		memset(a,0,sizeof(a));
		scanf("%d%d",&n,&m);
		while(m--){
			int x=0,y=0,z=0;
			char ch;
			getchar();
			scanf("%c",&ch);
			getchar();
			if (ch=='X') scanf("%d",&x);
			else if (ch=='Y') scanf("%d",&y);
			else if (ch=='Z') scanf("%d",&z);
			getchar();
			scanf("%c",&ch);
			getchar();
			if (ch=='X') scanf("%d",&x);
			else if (ch=='Y') scanf("%d",&y);
			else if (ch=='Z') scanf("%d",&z);
			//printf("%d%d %d\n",x,y,z);
			if (x==0&&yz[y][z]==0){
				yz[y][z]=1;
				yz[0][z]++;
				ans+=n-xz[0][z];
			}
			else if (y==0&&xz[x][z]==0){
				xz[x][z]=1;
				xz[0][z]++;
				ans+=n-yz[0][z];
			}
			else if (z==0){
				tot++;
				a[tot].x=x;
				a[tot].y=y;
			}
		}
		sort(a+1,a+tot+1,cmp);
		for(int i=1;i<=tot;i++)
			if (i>1&&a[i].x==a[i-1].x&&a[i].y==a[i-1].y) continue;
			else{
				for(int z=1;z<=n;z++)
					if (!xz[a[i].x][z]&&!yz[a[i].y][z]) ans++;
			}
		printf("%d\n",ans);
	}
	return 0;
}


Appium源码分析(7)-status模块

该模块中定义了36种不同的状态,以及状态的解释信息,还有一个模块方法,这个模块相对简单 36种状态1个json字符串定义了36个元素,每一元素代表了一个状态,每一个状态有一个名称,然后对应一个json...
  • qhshiniba
  • qhshiniba
  • 2015年05月04日 15:18
  • 4763

浅析ButterKnife的实现 (三) —— BindView

相关文章: 如何实现ButterKnife (一) —— 搭建开发框架 如何实现ButterKnife (二) —— BindResource 这里开始讲解最常用的绑定View的注解了,这个会比资...
  • github_35180164
  • github_35180164
  • 2016年08月15日 14:16
  • 5323

Git版本管理:Windows下Git配置与使用指南

转自:http://blog.163.com/thinki_cao/blog/static/83944875201322615252135/ 简要介绍:Git是一个开源的分布式版本控制系统,用以有效...
  • dabusideqiang
  • dabusideqiang
  • 2014年12月01日 10:41
  • 2401

HDOJ 3682 To Be an Dream Architect 暴力

//HDOJ 3682 To Be an Dream Architect 暴力 /* 题意: 有一个n*n的魔方,每次去除一排,问最后剩几个 思路: 只有1000次删除,记录所有删除的点,排序后去重...
  • xiamiwage
  • xiamiwage
  • 2012年10月08日 00:06
  • 399

hdu 3682 To Be an Dream Architect

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3682 题目大意:给一个n*n*n的立方体,由1*1*1的小格子组成,起始坐标为(1,1,1),然后...
  • niuxiunan
  • niuxiunan
  • 2013年10月16日 18:16
  • 741

hdu3682 To Be an Dream Architect

题意:一个三维空间中的一个立方体,每次给一条线,线所经过单位立方体被消去            最多一千条,问最终被消去多少个小块 因为只有一千条线,那么可以记录每个点是否消去过。对!可以map之...
  • Colin_27
  • Colin_27
  • 2013年10月22日 21:02
  • 432

To Be an Dream Architect(2010年ACM亚洲预选赛杭州赛区第三题))

ProblemC. To Be an Dream Architect Description The “dreamarchitect” is the key role in a team ...
  • hanchaoqi
  • hanchaoqi
  • 2012年11月11日 21:07
  • 541

20年架构师写给程序员的一封信《From an architect to a programmer 》

《From an architect to a programmer 》 只有中文,读完后好多地方还是不明白,于是就搜索了下原文,觉得原作者的好多想法并没有被很好的翻译出来,于是自己尝试着重新翻译下...
  • zhuxuetian
  • zhuxuetian
  • 2012年04月01日 15:13
  • 227

How to be a Software Architect?(Transferred)

论软件架构师的角色和培养 分类: 软件设计 构架2006-09-14 14:17 1211人阅读 评论(1) 收藏 举报 1 软件架构与软件架构师         定义1(软件架...
  • HCI4SE2010
  • HCI4SE2010
  • 2011年09月16日 20:49
  • 688

How To Be an Effective Team Leader

Coach, Don't Demonstrate When you're under a time crunch, it's tempting to demonstrate a task rathe...
  • u012914709
  • u012914709
  • 2014年07月01日 21:30
  • 419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDOJ 3682 To Be an Dream Architect
举报原因:
原因补充:

(最多只允许输入30个字)