Press the Button ZOJ - 3586 模拟

一道关于模拟的ZOJ题目让我困扰了三天,主要难点在于如何正确剪枝。关键发现是,当剩余操作次数少于当前与目标数组的不同元素数量时,该情况无法达成。此外,通过将输入扩大倍数并用整数表示键盘灰尘数,可以简化计算,降低时间复杂度到20ms,这是非常巧妙的优化策略。
摘要由CSDN通过智能技术生成

又鸽了两天

这道题我做了三天。。。无语(其实只做了一天,剩下的时间自闭)

每一种数组其实有不止一种方案,(我就是错在这里了,然后超时了),好久不做模拟,都不会剪枝了

如果还有n部操作,但是当前数组与目标数组的不同数量大于n,肯定就不行了(很强的剪枝了)

(不要嫌代码长,都很水)

220ms代码

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 10000007;
int n, m, p, q;
long long cnt1 = 0;
bool flag;
ll N[7][2];												//N[i][0]/N[i][1]
ll M[7][2];
ll gcd(ll a, ll b) {									
	while (a^=b^=a^=b%=a);
	return b;
}
char op[100];												//输入字符串
void qiefen(int x) {										//把输入的字符串转成a/b的形式
	int i;
	for (i = 0; op[i] && op[i]!='/'; ++i) {				//先转化分子
		//nu[i][0] = nu[i][0] * 10 + op[i] - '0';
		N[x][0] = (N[x][0]<<3)+(N[x][0]<<1)+(op[i]^48);
	}
	if (op[i]=='/') {										//如果有分母就继续算
		for (i++; op[i]; ++i) 
			N[x][1] = (N[x][1]<<3)+(N[x][1]<<1)+(op[i]^48);
	}
	else N[x][1] = 1;										//没有分母按1
	if (N[x][0]&&N[x][1])		//分子分母约分
	{
		ll yueshu = gcd(N[x][0], N[x][1]);
		N[x][0] /= yueshu;
		N[x][1] /= yueshu;
	}
}

i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值