题解:P2030 遥控车
第一问(怎么都用二分?怎么都用二分?怎么都用二分?)
用哈希 + unordered_map 秒了。
建议不要用 map,实测超慢。
第二问
打个表你会发现是斐波那契数列,但是具体为什么?
设 \(f_i\) 为以第 \(i\) 辆车结尾的可能排列数。
可以发现放错了就是交换相邻两个车,然后我们对于最后一个车分讨一下。
-
原地不动,那么继承 \(f_{i-1}\) 的值。
-
与上一个交换,那么只有前 \(i-2\) 个要排,继承 \(f_{i-2}\) 的值。
所以得 \(f_i = f_{i-1} + f_{i-2}\)。
Code
#include <bits/stdc++.h>
using namespace std;
const long long base = 13331;
long long n, m, cnt, h[100005];
unordered_map<long long, bool> mp;
string jia(string a , string b){
string c = "";
int x[10005] = {} , y[10005] = {} , z[10005] = {};
for(int i = a.size() - 1, j = 1; i >= 0; i--, j++)x[j] = a[i] - '0';
for(int i = b.size() - 1, j = 1; i >= 0; i--, j++)y[j] = b[i] - '0';
int len = max(a.size(), b.size());
for(int i = 1; i <= len; i++){
z[i] += x[i] + y[i];
z[i + 1] += z[i] / 10;
z[i] %= 10;
}
if(z[len + 1] > 0) len++;
for(int i = len; i >= 1 ; i--) c += char(z[i] + '0');
return c;
}
string dp[100005];
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
for(int j = 0; j < s.size(); j++){
h[i] = h[i] * base + s[j];
mp[h[i]] = 1;
}
}
for(int i = 1; i <= m; i++){
string s;
cin >> s;
long long x = 0;
for(int j = 0; j < s.size(); j++){
x = x * base + s[j];
}
if(mp.count(x)) cnt++;
}
cout << cnt << '\n';
dp[0] = dp[1] = "1";
for(int i = 2; i <= n; i++){
dp[i] = jia(dp[i - 1], dp[i - 2]);
}
cout << dp[n];
return 0;
}
本文来自博客园,作者:KukCair,转载请注明原文链接:https://www.cnblogs.com/KukCair/p/18995588

浙公网安备 33010602011771号