acm-(分类讨论、思维、对称性)Codeforces Round #676 (Div. 2) D. Hexagons

该博客探讨了一个利用对称性减少计算量的路径规划问题。通过分析起点和终点的六条射线交点,可以将问题简化为特定路径类型。通过对坐标系进行旋转并分类讨论,计算出最小路径成本。最终,通过三次旋转求得所有情况下的最优解。
摘要由CSDN通过智能技术生成

题面
传送门
本题主要是利用对称性减少码量,首先注意到我们可以把从 ( 0 , 0 ) (0,0) (0,0)出发的六条射线画出来,大致如下图所示:
图一
不难发现,我们可以从起点的六条射线之一出发,然后走到终点的六条射线之一,再顺着终点的射线走到终点。因此两个点的射线之间的交点显得尤为重要。

由于终点不固定,我们考虑终点的射线与起点的射线相交的情况,然后根据对称性,我们先只考虑终点的 ② 、 ⑥ ②、⑥ 类型的射线与起点射线的相交情况,也就是我们只考虑这样的一条路径:从起点出发,经过起点的六条射线之一走到某个与终点 ② 、 ⑥ ②、⑥ 类型的射线的交点,然后经过终点的 ② 、 ⑥ ②、⑥ 类型的射线到达终点。

我们可以简单的分类讨论从而计算出上述情况的答案。

利用对称性,我们对整个坐标系向右旋转 6 0 。 60^。 60,自然地 c c c的值也要旋转一下, x , y x,y x,y的值也要改变一下,容易发现 ( x ′ , y ′ ) = ( y , y − x ) (x',y')=(y,y-x) (x,y)=(y,yx),然后我们再按刚才的方式求一下答案。旋转三次我们就能够求出所有情况的答案。取个max即可。

ll c[6],cc[6],x,y;
ll work(ll x,ll y){
	ll ans=INF;
	if(x<=0){
		if(y<=x){
			ans=min(ans,abs(x-y)*c[4]+c[3]*abs(x));
		}else{
			ans=min(ans,abs(x-y)*c[1]+c[3]*abs(x));
		}
		if(y<=0)ans=min(ans,abs(y)*c[4]+c[2]*abs(x));
		else ans=min(ans,abs(y)*c[1]+c[2]*abs(x));
	}else{
		if(y<=x){
			ans=min(ans,abs(x-y)*c[4]+c[0]*abs(x));
		}else{
			ans=min(ans,abs(x-y)*c[1]+c[0]*abs(x));
		}
		if(y<=0)ans=min(ans,abs(y)*c[4]+c[5]*abs(x));
		else ans=min(ans,abs(y)*c[1]+c[5]*abs(x));
	}
	return ans;
}
void rotate(){
	ll t=y;
	y-=x;
	x=t;
	FOR(i,0,6)c[i]=cc[((i+1)%6+6)%6];
	FOR(i,0,6)cc[i]=c[i];
}
int main(){
	int t=rd();
	while(t--){
		x=rd(),y=rd();
		FOR(i,0,6)c[i]=rd();
		if(!x && !y){
			wrn(0);
			continue;
		}
		FOR(i,0,6)cc[i]=c[i];
		ll ans=INF;
		ans=min(ans,work(x,y));
		rotate();
		ans=min(ans,work(x,y));
		rotate();
		ans=min(ans,work(x,y));
		printf("%lld\n",ans);
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值