蓝桥杯2022年C++b组E.X进制减法
题目
暴力做法 dfs
/*
样例输入:
11
3
10 4 0
3
1 2 0
样例输出:
94
*/
//难点在于理解题意和进制
//暴力做法 dfs 能过30%
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e5 + 10,INF=0x3f3f3f3f;
typedef long long ll;
ll ans = INF;
ll mod = 1000000007;
ll a[N],b[N];//存A,B各数位上的数
int x[N]; //存每一位的进制
int n,ma,mb,m;
ll a1,b1;
void dfs(int u)
{
//出口
if(u >= m)
{
//求A
for(int i=0;i<ma;i++)
{
ll x1=1;
for(int j=i+1;j<ma;j++)
{
x1 *= x[j];
}
a1 += a[i] * x1;
}
//求B
for(int i=0;i<mb;i++)
{
ll x2=1;
for(int j=i+1;j<mb;j++)
{
x2 *= x[j];
}
b1 += b[i] * x2;
}
ans = min(a1-b1,ans);
return;
}
for(int i=2;i<=n;i++)
{
//剪枝
int t = max(a[u],b[u]);
if(t >= i) continue;
x[u] = i;
dfs(u+1);
}
}
int main()
{
//读数据
cin >> n >> ma;
for(int i=0;i<ma;i++) cin >> a[i];
cin >> mb;
for(int i=0;i<mb;i++) cin >> b[i];
m = max(ma,mb);
dfs(1);
cout << ans%mod << endl;
return 0;
}
正解 贪心
// 正解:贪心,推公式,x[i] = max({a[i]+1, b[i]+1, 2})
//把x进制转换为十进制用秦九韶算法
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e5 + 10,INF=0x3f3f3f3f;
typedef long long ll;
ll ans = INF;
ll mod = 1000000007;
ll a[N],b[N];//存A,B各数位上的数
int x[N]; //存每一位的进制
int n,ma,mb,m;
ll a1,b1;
int main()
{
//读数据
cin >> n >> ma;
for(int i=0;i<ma;i++) cin >> a[i];
cin >> mb;
for(int i=0;i<mb;i++) cin >> b[i];
m = max(ma,mb);
//推公式得出 x[i] = max({a[i]+1, b[i]+1, 2})
for(int i=0;i<m;i++)
{
x[i] = max(a[i]+1, b[i]+1);
x[i] = max(x[i],2);
}
ans = 0;
//用秦九韶算法把x进制转换为十进制
for(int i=0;i<m;i++)
{
ans = (ans*x[i] + a[i]-b[i]) % mod;
}
cout << ans%mod << endl;
return 0;
}
秦九韶算法
秦九韶算法通过递归分治的思想,将原多项式转化为一系列嵌套的一次项表达式,从而极大地减少了计算过程中所需的乘法与加法次数。
秦九韶算法的核心思想: 对于一元n次多项式:
可以将其重写为以下形式: