又鸽了两天
这道题我做了三天。。。无语(其实只做了一天,剩下的时间自闭)
每一种数组其实有不止一种方案,(我就是错在这里了,然后超时了),好久不做模拟,都不会剪枝了
如果还有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