- 题库链接:link<-----div1+2HSSC21-22题库
- A题:link 思维题
- 1、题意:只有末尾是9才会满足S(x+1)< S(x)所以判断从1~n里面有多少个末尾是9的数
- 2、转化:直接除10是判断从1~n - 1里面有多少个符合的,所以先判断n是不是以9结尾要是最后答案++
#include<iostream>
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
int n; cin >> n;
int t = 0;
if (n % 10 == 9)t = 1;
cout << n / 10 + t << endl;
}
return 0;
}
- B题:link 字符串
- 1、题意:从字符串a上找一个位置从这个位置先向右走若干位后向左走若干位可以形成字符串b
- 2、转化:n^2用substr枚举起点以及向右走的长度,再加上b.size() - 向右长度的向左的长度,如果等于b则跳出(照这个写法太复杂不好写)可以直接将正向与反向加在一个字符串上面用s.find()查找要是返回值不是-1代表找到跳出循环就好
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
string st, ed;
cin >> st >> ed;
int len = st.size();
bool flag = false;
for (int i = 0; i < len; i++)
{
string s1, s2;
s1 += st.substr(0, i + 1), s2 += st.substr(0, i);
reverse(s2.begin(), s2.end());
s1 += s2;
if (s1.find(ed) != -1)
{
flag = true;
break;
}
}
if (flag)puts("YES");
else puts("NO");
}
return 0;
}
- C题:link 模拟题
- 1、题意:给你一个字符串判断最少执行到哪一个字符的时候可以不执行后面的字符从而判断胜负,未执行到的字符和?字符均不是已知的
- 2、转化:先贪心分别贪心A队伍胜利和B队伍胜利,偏袒出两个不含?的字符串,最后分别处理两个字符串,只要A队超B队的得分大于A队剩余的点球次数就跳出循环,反之B超过A也跳出循环
#include<iostream>
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
string s;
cin >> s;
string win_m = s, win_n = s;
int ans = 10;
for (int i = 0; i < 10; i++)
{
if (s[i] == '?')
{
if (i & 1)win_m[i] = '1', win_n[i] = '0';
else win_m[i] = '0', win_n[i] = '1';
}
}
int winm = 0, winn = 0, m = 5, n = 5;
for (int i = 0; i < 10; i++)
{
if (i & 1)
{
if (win_m[i] == '1')m--, winm++;
else m--;
}
else
{
if (win_m[i] == '1')n--, winn++;
else n--;
}
if (winn - winm > m || winm - winn > n)ans = min(i + 1, ans);
}
winm = 0, winn = 0, m = 5, n = 5;
for (int i = 0; i < 10; i++)
{
if (i & 1)
{
if (win_n[i] == '1')n--, winn++;
else n--;
}
else
{
if (win_n[i] == '1')m--, winm++;
else m--;
}
if (winn - winm > m || winm - winn > n)ans = min(i + 1, ans);
}
cout << ans << endl;
}
return 0;
}
- D题:link 字符串
- 1、题意:从a中依次读入字符,读入过程中可以按Backspace代替键入,这样会抵消当前的键入和删除当前已经输入的最后一位,看是否能通过某种键入方式得到字符串b
- 2、转化:发现正序模拟前面找到的匹配字符串可能会背后面的backspace删掉所以选择倒序操作模拟,找到相等的,即匹配上的字符前移,不匹配的删掉本身以及前面的一个字符相当于点击backspace在当前匹配位置,b串匹配玩表示匹配成功
#include<iostream>
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
string s, t; cin >> s >> t;
int lens = s.size() - 1, lent = t.size() - 1;
if (lens < lent)puts("NO");
else
{
int l = lens, pos = lent;
while (l >= 0 && pos >= 0)
{
if (s[l] == t[pos])l--, pos--;
else l -= 2;
}
if (pos == -1)puts("YES");
else puts("NO");
}
}
return 0;
}
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N = 3e5 + 10;
int p[N], num[N], a[N];
int n, m;
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int t; cin >> t;
while (t--)
{
cin >> n >> m;
memset(num, 0, 4 * n);
for (int i = 0; i < n; i++)
{
cin >> a[i]; a[i]--;
num[(i - a[i] + n) % n]++;
}
vector<int> ans;
for (int i = 0; i < n; i++)
if (num[i] + 2 * m >= n)
{
for (int j = 0; j < n; j++) p[j] = j;
for (int j = 0; j < n; j++)
{
p[find(j)] = find((a[j] + i) % n);
}
int k = n;
for (int j = 0; j < n; j++)
if (find(j) == j) k--;
if (k <= m) ans.push_back(i);
}
cout << ans.size() << ' ';
for (int h : ans) cout << h << ' ';
cout << endl;
}
return 0;
}