目录
制作不易,求求点赞加关注
一.合法密码
题目链接:https://www.lanqiao.cn/problems/20124/learning/

1.题目讲解

2.代码实现
cpp
#include <iostream>
using namespace std;
string s = "kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th";
bool check(int l,int r)
{
int a = 0,b = 0;
for(int i = l;i <= r;i++)
{
if(s[i] >= '0' && s[i] <= '9')
{
a++;
}
else if(s[i] >= 'a' && s[i] <= 'z')
{
}
else
{
b++;
}
}
return a >= 1 && b >= 1;
}
int main()
{
int n = s.size();
int ans = 0;
for(int len = 8;len <= 16;len++)
{
for(int i = 0;i + len - 1 < n;i++)
{
if(check(i,i + len - 1))
{
ans++;
}
}
}
cout << ans << endl;
return 0;
}
最终答案是400 (可以直接输出)
二.选数概率
题目链接:https://www.lanqiao.cn/problems/20157/learning/

1.题目讲解





2.代码实现
cpp
#include <iostream>
using namespace std;
int main()
{
cout << "55,94,56";
return 0;
}
三.蚂蚁开会
题目链接:https://www.lanqiao.cn/problems/20133/learning/

1.题目讲解



2.代码实现
cpp
#include <iostream>
#include <map>
using namespace std;
typedef pair<int,int> PII;
int n,ret,x1,y1,x2,y2;
map<PII,int> mp;
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b,a % b);
}
void calc()
{
int dx = x2 - x1,dy = y2 - y1;
int d = gcd(abs(dx),abs(dy));
dx /= d;
dy /= d;
for(int i = x1,j = y1;;i += dx,j += dy)
{
mp[{i,j}]++;
if(mp[{i,j}] == 2)
{
ret++;
}
if(i == x2 && j == y2)
{
break;
}
}
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> x1 >> y1 >> x2 >> y2;
calc();
}
cout << ret << endl;
return 0;
}
四.立定跳远
题目链接:https://www.lanqiao.cn/problems/20132/learning/

1.题目讲解


2.代码实现
cpp
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n,m,a[N];
bool check(int x)
{
int sum = 0;
for(int i = 1;i <= n;i++)
{
sum += (a[i] - a[i - 1] - 1) / x;
}
return sum <= m + 1;
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
}
int l = 1,r = 1e8;
while(l < r)
{
int mid = (l + r) / 2;
if(check(mid))
{
r = mid;
}
else
{
l = mid + 1;
}
}
cout << l << endl;
return 0;
}
五.最小字符串
题目链接:https://www.lanqiao.cn/problems/20167/learning/

1.题目讲解

一个简单的模拟题目
2.代码实现
cpp
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
string s,t;
int main()
{
cin >> n >> m;
cin >> s >> t;
sort(t.begin(),t.end());
string ans;
int cur1 = 0,cur2 = 0;
while(cur1 < n && cur2 < m)
{
if(s[cur1] <= t[cur2])
{
ans += s[cur1];
cur1++;
}
else
{
ans += t[cur2];
cur2++;
}
}
while(cur1 < n)
{
ans += s[cur1];
cur1++;
}
while(cur2 < m)
{
ans += t[cur2];
cur2++;
}
cout << ans << endl;
return 0;
}
六.数位翻转
题目链接:https://www.lanqiao.cn/problems/20145/learning/

1.题目讲解



2.代码实现
cpp
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1010;
LL n,m,a[N],b[N];
LL f[N][N],g[N][N];
LL calc(LL x)
{
LL ret = 0;
while(x)
{
ret = ret * 2 + x % 2;
x /= 2;
}
return ret;
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
b[i] = calc(a[i]);
}
for(int i = 1;i <= n;i++)
{
f[i][0] = f[i - 1][0] + a[i];
for(int j = 1;j <= m;j++)
{
f[i][j] = max(f[i - 1][j],g[i - 1][j]) + a[i];
g[i][j] = max(f[i - 1][j - 1],g[i - 1][j]) + b[i];
}
}
LL ret = 0;
for(int j = 0;j <= m;j++)
{
ret = max(ret,max(f[n][j],g[n][j]));
}
cout << ret << endl;
return 0;
}
七.数星星
题目链接:https://www.lanqiao.cn/problems/20261/learning/

1.题目讲解



2.代码实现
cpp
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10,MOD = 1e9 + 7;
LL n,d[N],L,R;
LL f[N],g[N];
LL mp[N];
LL qpow(LL a,LL b)
{
LL ret = 1;
while(b)
{
if(b & 1)
{
ret = ret * a % MOD;
}
a = a * a % MOD;
b >>= 1;
}
return ret;
}
void init()
{
f[0] = 1;
for(int i = 1;i <= n;i++)
{
f[i] = f[i - 1] * i % MOD;
}
g[n] = qpow(f[n],MOD - 2);
for(int i = n - 1;i >= 0;i--)
{
g[i] = g[i + 1] * (i + 1) % MOD;
}
}
LL C(int n,int m)
{
if(m > n)
{
return 0;
}
return f[n] * g[m] % MOD * g[n - m] % MOD;
}
LL calc(int x)
{
if(mp[x] != -1)
{
return mp[x];
}
LL sum = 0;
for(int i = L - 1;i <= R - 1;i++)
{
sum = (sum + C(x,i)) % MOD;
}
return mp[x] = sum;
}
int main()
{
cin >> n;
for(int i = 1;i < n;i++)
{
int a,b;
cin >> a >> b;
d[a]++;
d[b]++;
}
cin >> L >> R;
init();
memset(mp,-1,sizeof(mp));
LL ret = 0;
for(int i = 1;i <= n;i++)
{
ret = (ret + calc(d[i])) % MOD;
}
if(L <= 2 && 2 <= R)
{
ret = ((ret - n + 1) % MOD + MOD) % MOD;
}
cout << ret << endl;
return 0;
}
八.套手镯
题目链接:https://www.lanqiao.cn/problems/20148/learning/


1.题目讲解




总的时间复杂度是O(n * n * logN)
2.代码实现
cpp
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1010;
int n,w,h,ret;
struct node
{
int u,d,l,r;
}a[N];
bool cmp(node& a,node& b)
{
return a.u < b.u;
}
void solve()
{
for(int i = 1;i <= n;i++)
{
int L = a[i].l,R = a[i].l + w;
priority_queue<int,vector<int>,greater<int>> heap;
for(int j = 1;j <= n;j++)
{
if(a[j].l < L || a[j].r > R)
{
continue;
}
heap.push(a[j].d);
while(heap.size() && heap.top() < a[j].u - h)
{
heap.pop();
}
ret = max(ret,(int)heap.size());
}
}
}
int main()
{
cin >> n >> w >> h;
for(int i = 1;i <= n;i++)
{
int x,y,r;
cin >> x >> y >> r;
a[i] = {y + r,y - r,x - r,x + r};
}
sort(a + 1,a + n + 1,cmp);
solve();
swap(w,h);
solve();
cout << ret << endl;
return 0;
}
九.跳石头
题目链接:https://www.lanqiao.cn/problems/20151/learning/

1.题目讲解

我们采用位图进行优化
2.代码实现
cpp
#include <iostream>
#include <bitset>
using namespace std;
const int N = 4e4 + 10;
int n,c[N];
bitset<N> f[N];
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> c[i];
}
int ret = 0;
for(int i = n;i >= 1;i--)
{
f[i][c[i]] = 1;
if(i + i <= n)
{
f[i] |= f[i + i];
}
if(i + c[i] <= n)
{
f[i] |= f[i + c[i]];
}
ret = max(ret,(int)f[i].count());
}
cout << ret << endl;
return 0;
}
十.最长回文前后缀
题目链接:https://www.lanqiao.cn/problems/20169/learning/

1.题目讲解



2.代码实现
cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int pi[N];
int kmp(string& a,string& b)
{
string s = " " + a + "#" + b;
int n = a.size(),ret = 0;
for(int i = 2,j = 0;i <= n + n + 1;i++)
{
while(j && s[i] != s[j + 1])
{
j = pi[j];
}
if(s[i] == s[j + 1])
{
j++;
}
pi[i] = j;
if(i > n && i < n + n + 2 - pi[i])
{
ret = max(ret,pi[i]);
}
}
return ret;
}
int main()
{
string s;
cin >> s;
int l = 0,r = s.size() - 1;
while(l < r)
{
if(s[l] != s[r])
{
break;
}
l++;
r--;
}
string a = s.substr(l,r - l + 1);
string b = a;
reverse(b.begin(),b.end());
cout << l + max(kmp(a,b),kmp(b,a)) << endl;
return 0;
}