google code jam 2014 RB_C

求割来计算最大流,问题求补,条件是对偶问题的不对称性,形象来说,就是已知棋盘格子数,大部分都是棋子,求棋子个数,当然数空格数,就是这个道理。

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;


#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define INF 0x7fffffff

int abs(int a){
	return a>0?a:-a;
}
int T,W,H,B,x[2004],y[2004];
int edge[2][1002][1002],edge2[1002][1002];
int dis[1002];
bool vis[1002];


int main(){
	freopen("C-large-practice .in","r",stdin);
	freopen("out2","w",stdout);
	scanf("%d",&T);
	for(int cas=1; cas<=T; ++cas){
		scanf("%d%d%d",&W,&H,&B);
		for(int i=0; i<2*B; i+=2){
			scanf("%d%d%d%d",x+i,y+i,x+i+1,y+i+1);
		}
		x[2*B]=-1; y[2*B]=0; x[2*B+1]=-1; y[2*B+1]=H-1;
		x[2*B+2]=x[2*B+3]=W; y[2*B+2]=0; y[2*B+3]=H-1;
		for(int i=0; i<B+2; ++i){
			for(int j=0; j<B+2; ++j){
				if(i==j) continue;
				if(x[2*i]>=x[2*j]-1&&x[2*i]<=x[2*j+1]+1) edge[0][i][j]=edge[0][j][i]=0;
				else if(x[2*i+1]>=x[2*j]-1&&x[2*i+1]<=x[2*j+1]+1) edge[0][i][j]=edge[0][j][i]=0;
				else{
					edge[0][i][j]=edge[0][j][i]=min(abs(x[2*j+1]-x[2*i]),abs(x[2*i+1]-x[2*j]));
					edge[0][i][j]--;
				}
				
				if(y[2*i]>=y[2*j]-1&&y[2*i]<=y[2*j+1]+1) edge[1][i][j]=edge[1][j][i]=0;
				else if(y[2*i+1]>=y[2*j]-1&&y[2*i+1]<=y[2*j+1]+1) edge[1][i][j]=edge[1][j][i]=0;
				else{
					edge[1][i][j]=edge[1][j][i]=min(abs(y[2*j+1]-y[2*i]),abs(y[2*i+1]-y[2*j]));
					edge[1][i][j]--;
				}
				
				edge2[i][j]=max(edge[0][i][j],edge[1][i][j]);
			}
		}
		for(int i=0; i<B+2; ++i)
			for(int j=0; j<B+2; ++j)
				edge2[i][j]=min(edge2[i][j],edge2[j][i]);
		
		for(int i=0; i<B+2; ++i) dis[i]=INF,vis[i]=false;
		dis[B]=0;
		priority_queue<pair<int,int> > q;
		q.push(make_pair(0,B)); 
		while(q.empty()==false){
			pair<int,int> tmp=q.top();
			if(tmp.second==B+1) break;
			vis[tmp.second]=true;
			q.pop();
			for(int i=0; i<B+2; ++i){
				if(vis[i]) continue;
				if(-tmp.first+edge2[i][tmp.second]<dis[i]){
					q.push(make_pair(tmp.first-edge2[i][tmp.second],i));
					dis[i]=-tmp.first+edge2[i][tmp.second];
				}
			}
		}
		printf("Case #%d: %d\n",cas,dis[B+1]);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ite_ec_c_code_program_guide是一份关于ITE电子创客编程的指南,该指南主要介绍了如何使用C语言编程来实现电子设备的控制和功能扩展。该指南包含了许多基础知识,如C语言语法、数据类型、变量、运算符、流程控制和函数等,并通过实际项目示例来展示如何使用这些知识实现电子创客项目。 在该指南中,使用的编程开发平台是Arduino和Raspberry Pi,这两个平台非常适合初学者和电子爱好者,因为它们易于使用、功能强大,而且有很多社区和论坛可以获得支持和帮助。 指南中还介绍了各种传感器和执行器的基础知识,如温度传感器、湿度传感器、光线传感器、电机、继电器和舵机等,并演示了如何通过编程控制这些设备,实现各种电子创客项目。 通过该指南的学习,可以了解到电子创客编程的基础知识和实践方法,并学会如何使用C语言编程实现电子设备的控制和功能扩展。这对初学者和电子爱好者来说是非常有益的,因为这可以帮助他们更好地理解和掌握电子创客领域的知识和技能。 ### 回答2: ite_ec_c_code_program_guide是一份关于ite_ec_c代码编程的指南。ite_ec_c是一个支持ARM Cortex-M3/M4的嵌入式控制器,该指南提供了有关如何使用该控制器编写c代码的详细信息。 该指南主要包括以下部分: 1.介绍了ite_ec_c控制器的基本功能和特性,以及如何配置控制器的寄存器和引脚。 2.详细介绍了ite_ec_c的编程环境和工具链,包括编译器、调试器、仿真器等。 3.详细说明了如何使用C语言编写控制器的各种功能,包括GPIO、串口、定时器、ADC、DMA、中断等。 4.提供了一些常用的代码示例和实验,帮助读者更好地理解和掌握ite_ec_c的编程。 该指南对于嵌入式系统的开发者非常有用,特别是那些使用ARM Cortex-M3/M4架构的控制器的开发者。同时,该指南也适用于那些对嵌入式系统编程感兴趣的人,他们可以通过该指南学习如何设计和实现简单的嵌入式系统。 总之,ite_ec_c_code_program_guide提供了一个全面的指导,帮助读者更好地理解和掌握ite_ec_c控制器的编程,并帮助他们在嵌入式系统的开发中更加高效和准确地实现自己的想法和设计。 ### 回答3: ite_ec_c_code_program_guide是指ITe公司的EC C Code编程指南,旨在指导初学者学习EC C Code编程语言。 EC C Code是一种适用于嵌入式系统编程的高级编程语言,在工业控制、物联网、汽车和航空等领域应用广泛。EC C Code编程指南从编程语言基础、编译器配置、Debug调试、内存管理等方面入手,深入浅出地讲解EC C Code编程的必要知识,帮助初学者快速入门。 在EC C Code编程指南中,首先介绍了EC C Code的基本语法和语句结构,并提供了大量的代码实例和练习题。其次是介绍EC C Code编译器的配置方法和调试技巧,让读者能够熟练运用编译器进行程序开发和调试。同时,指南还介绍了EC C Code编程中常见的内存管理技术,如堆、栈的概念及其使用方法,有助于读者理解软件程序运作的内部动态。 总之,ite_ec_c_code_program_guide对于学习EC C Code编程的初学者来说是一本非常实用的指南,它提供了全面的教学内容和规范的编程实践方法,能够帮助读者快速提升编程技能,在实际应用中更加得心应手。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值