这次题感觉出了很好,点个赞。

不会 题。

前面的题感觉很磕思维,得想一会儿。

小红的单词整理

签到题

#include <bits/stdc++.h>
using namespace std;
const int N = 101001;

int n, m, ans;
int main()
{
    string s, k;
    cin >> s >> k;
    cout << k << "\n";
    cout <<s;
    return 0;
}

小红煮汤圆

算出煮的次数,模拟即可。

复杂度

#include <bits/stdc++.h>
using namespace std;
const int N = 101001;

int n, m, ans, k, x;
int main()
{
    cin >> n >> x >> k;

    m = n * x / k;
    cout << n * x / k << "\n";

    int la = 0;
    int sum = 0;
    while (sum < m)
    {
        if (la >= k)
        {
            la -= k;
            cout << 0 << " ";
            sum++;
            continue;
        }

        int res = 0;
        while (la < k)
        {
            la += x;
            res++;
        }
        la -= k;
        cout << res << " ";
        sum++;
    }
    return 0;
}

小红的 01 串

开始一看以为是背包问题,因为对于前两个位置是删与不删的关系。

多看两眼发现,对于第一个字符必然是 的时候满足最优情况。

那么只需要考虑第二个字符是否删即可,由于后面的被删时前一个必然也被删掉,那只需要删掉每一次更新一下最大值即可。

复杂度

#include <bits/stdc++.h>
using namespace std;
const int N = 101001;
char s[N];
int n, m, ans;
int main()
{
    cin >> s + 1;
    n = strlen(s + 1);
    int t = 1;
    for (int i = 1; i <= n; i++)
    {
        if (s[i] == '0')
            t++;
        else
            break;
    }
    for (int i = t; i <= n; i++)
    {
        if (s[i] == '1')
            ans++;
        else
            ans--;
    }
    // cout << t << "\n";
    int res = ans;
    for (int i = t + 1; i <= n; i++)
    {
        if (s[i] == '0')
            res++;
        else
            res--;
        ans = max(res, ans);
    }
    cout << ans;
    return 0;
}

小红的数组清空

快排一下,优先对小的数使用第一个操作,每次操作完寻找该数组中是否还有没被清空的

由于数组快排过,可直接使用 求出是否存在。

记录一下清空数的下标。

复杂度

#include <bits/stdc++.h>
using namespace std;
const int N = 101001;
int a[N];
bool v[N];
int n, m, ans;
void dfs(int k, int s)
{
	while (a[k] == s)
	{
		if (v[k] == 0)
		{
			v[k] = 1;
			int q = lower_bound(a + 1, a + n + 1, s + 1) - a;
			dfs(q, s + 1);
			break;
		}
		k++;
	}
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; i++)
	{
		if (v[i] == 1)
			continue;
		v[i] = 1;
		m = a[i];
		ans++;
		int k = lower_bound(a + 1, a + n + 1, m + 1) - a;
		dfs(k, m + 1);
	}
	cout << ans;
	return 0;
}

小红勇闯地下城

开始看错题以为是像数字三角形那样,只能往右或者往下走,以为是 ,没想到居然能骗 分。

后来用了宽搜没有加 数组,导致空间爆了。

后来发现广搜求最小值,这不就是最短路嘛。

直接 板子题过了。

复杂度

#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
#define int long long

int dx[5] = {0, -1, 0, 1, 0};
int dy[5] = {0, 0, 1, 0, -1};
struct nihao
{
    int w;
    int x, y;
    bool operator<(const nihao &u) const
    {
        return w > u.w;
    }
};
int n, m, x;
int u, v, uu, vv;

void solve()
{

    cin >> n >> m >> x;
    char mp[n + 10][m + 10];
    int dis[n + 10][m + 10];
    bool vis[n + 10][m + 10];
    memset(dis, 0x3f3f3f3f, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> mp[i][j];

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            if (mp[i][j] == 'T')
                uu = i, vv = j;
            if (mp[i][j] == 'S')
                u = i, v = j;
        }
    priority_queue<nihao> q;
    q.push({0, u, v});
    dis[u][v] = 0;
    while (!q.empty())
    {

        nihao t = q.top();
        int x = t.x, y = t.y;
        int ddd = t.w;
        q.pop();
        if (vis[x][y])
            continue;
        vis[x][y] = 1;
        for (int g = 1; g <= 4; g++)
        {
            int i = x + dx[g], j = y + dy[g];
            if (i > n || i < 1 || j > m || j < 1)
                continue;
            if (i == uu && j == vv)
            {
                dis[uu][vv] = min(dis[uu][vv], dis[x][y]);
            }

            int D = ddd + mp[i][j] - '0';
            if (D < dis[i][j])
            {
                dis[i][j] = D;
                q.push({D, i, j});
            }
        }
    }
    if (dis[uu][vv] < x)
        cout << "Yes\n";
    else
        cout << "No\n";
}
int T;
signed main()
{
    cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}