CF赛后总结3:2021-07-22晚 HSSC21-22 div1+2 rating+219

  • 题库链接: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;
}
  • E题:待理解
#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;
}
  • 2021-11-04写于赣州

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值