P2660 zzc 种田

核心思路:我们发现我们每次最好是尽量切除最大的正方形,因为这样子我们可以尽量避免同一个位置的边被切多次(达到贪心的思想):

于是Up的第一个版本来了,模拟每一次切方块:

code(90#),最后一个点tle了,嗯.......,再想想,经过长达两年半的时间up终于悟出了,优化方案!

(见最下方code:)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll x,y,c,k,ans,tmp;
void solve() {
	cin>>x>>y;
	c=max(x,y),k=min(x,y);

	while(true) {
		ans=ans+(4*k);
		if((c==1&&k==1)||(c==0||k==0))break;
		c-=k;
		if(c<k) tmp=c,c=k,k=tmp;
	}
	cout<<ans<<"\n";
}
int main() {

	ios::sync_with_stdio(false);
	solve();
	return 0;
}

优化

思路是这样子的:我们原本我们是模拟,每一次切方块,每一次!,思考思考是否我们这需要模拟每一次呢!,换句话说:我们真的的有必要一次一次的砍掉嘛!不~

(咸鱼翻身!):我们只要求出当前长宽的情况,最多可以切出多少个最大方块,然后一次性把这些方块都剪掉(o1复杂度),这样子就可以大大降低时间复杂度

okk上ACcode(配上注释,安全食用~)

ACcode:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll x,y,c,k,ans,tmp;
void solve() {
	cin>>x>>y;
	c=max(x,y),k=min(x,y);

	while(c!=0&&k!=0) {
		
	   ans=ans+(c/k)*(4*k);//个数*周长 
	   //(c/k):求出当前还可以在c还大于k的情况下,我们可以最多切可长度为k的正方形 
	   c%=k;//c切(c/k)个正方形后的长度 
	   
	   if(k>c)tmp=k,k=c,c=tmp;//重新计算当前的长宽(以为经过上面操作,宽可能大长) 
	}
	cout<<ans<<"\n";
}
int main() {

	ios::sync_with_stdio(false);
	solve();
	return 0;
}

over~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值