9.14 深信服笔试编程题题解
// 先占个坑,题解笔试结束发
1. 第一题求最大公约数,c++和python都有现成的库可以用。C++(__gcd(int, int)), python(math.gcd(int, int)),也可以自己实现一个,并不难。
2. 贪心
输入n和一个长度为n的子串。
输出模1e9+7
#深信服笔试题##深信服笔试##include <bits/stdc++.h>
using namespace std;
int main() {
int n, k; cin >> n >> k;
vector<int> v(n);
for (int i = 0; i < n; i++) cin >> v[i];
int ans = 0;
for (int i = 0; i < n; i++) {
int m = v[i], M = v[i];
int j = i;
while (j+1 < n && max(M, v[j+1]) - min(m, v[j+1]) <= 2*k) {
M = max(M, v[++j]);
m = min(m, v[j]);
}
if (j < n-1)
ans ++;
i = j;
}
cout << ans << endl;
return 0;
} 3. 一个长度为n的01串,求出包含最长连续1的子串的个数。输入n和一个长度为n的子串。
输出模1e9+7
// 1.对于包含一个特定子串t的任意字符串,假设t的左边有l个字符,右边有r个字符,则
// 满足条件的字符串的个数为 (l+1)*(r+1)。
// 2.对于此题,我们可以枚举每一个具有最长连续1的字符串把它当作上上一句话的t。
// 有个要注意的地方是排除重复的串,自行体会代码中带注释地方的妙处。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n;
string s; cin >> s;
s = s.substr(0, n);
vector<int> start{-1};
int maxLen = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '0') continue;
int j = i;
while (j+1 < n && s[j+1] == s[i]) j++;
int cnt = j-i+1;
if (maxLen < cnt) {
maxLen = cnt;
start = vector<int>{-1};
start.push_back(i);
} else if (maxLen == cnt) {
start.push_back(i);
}
i = j;
}
start.push_back(n);
const int MOD = 1e9+7;
long long ans = 0;
for (int i = 1, iend = start.size()-1; i < iend; i++) {
// 仔细想想l和r为什么这么取
int l = start[i]-start[i-1], r = n-(start[i]+maxLen-1);
ans = (ans += 1LL*l*r) % MOD;
}
cout << ans << endl;
return 0;
} 

