2023年河南省大学生程序设计竞赛题解

Problem A. 小水獭游河南(暴力)

因为要求第一段所有位都不同,所以只需要枚举前26个就可以了,后面的暴力判断即可

注意要特判只有一个字母的情况

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 2e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	string s;
	cin >> s;
	vector<int> cnt(26);
	auto check = [&](int start)
	{
		int idx = 0;
		for (int i = start; i + idx < s.size();)
		{
			if (s[i + idx] != s[s.size() - 1 - idx]) return false;
			idx ++ ;
		}
		return true;
	};
	for (int i = 0; i < s.size(); i ++ )
	{
		int num = s[i] - 'a';
		cnt[num] ++ ;
		if (cnt[num] > 1) break;
		if (i + 1 < s.size() && check(i + 1))
		{
			cout << "HE\n";
			return;
		}
	}
	cout << "NaN\n";
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem B. Art for Rest(前缀和)

只需要维护一下前缀最大值和后缀最小值即可,遍历每段的长度,每次判断交界处前缀最大值是否小于等于后缀最小值,只要有一个地方不等于就不能满足条件

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    vector<int> maxx(n + 2), minn(n + 2, INF);
    for (int i = 1; i <= n; i ++ ) maxx[i] = max(maxx[i - 1], a[i]);
    for (int i = n; i >= 1; i -- ) minn[i] = min(minn[i + 1], a[i]);
    int ans = 1;
    for (int i = 1; i < n; i ++ )
    {
        bool flag = true;
        for (int j = i + 1; j <= n; j += i)
        {
            if (maxx[j - 1] > minn[j])
            {
                flag = false;
                break;
            }
        }
        if (flag) ans ++ ;
    }
    cout << ans << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem C. Toxel 与随机数生成器(暴力)

因为错误随机的循环节在1000-10000之间,所以判断一下字符串的前1000个有没有在后面出现过就可以了

好水的金牌题啊啊啊

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	string s;
    cin >> s;
    string tmp = s.substr(0, 1000);
    string txt = s.substr(1000, s.size() - 1000);
    if (txt.find(tmp) == string::npos) cout << "Yes\n";
    else cout << "No\n";
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem E. 矩阵游戏(dp+滚动数组)

看数据范围基本确定是dp

dp[i][j][k] 表示到 [i, j] 这个点,还有 k 次改变机会的最大价值,很容易得到转移方程:

  • 如果 g[i][j] == '1' ,有 dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]) + 1
  • 如果 g[i][j] == '?'k < x ,有 dp[i][j][k] = max({dp[i - 1][j][k], dp[i][j - 1][k], dp[i - 1][j][k + 1] + 1, dp[i][j - 1][k + 1] + 1})
  • 否则,dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k])

发现数据范围不允许我们这样开数组,注意到我们只用到了两层数据,所以开个滚动数组即可

#include <bits/stdc++.h>

using namespace std;

// #define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

int dp[2][510][1010];

void solve()
{
	int n, m, x;
    cin >> n >> m >> x;
    vector<string> g(n + 1);
    for (int i = 1; i <= n; i ++ )
    {
        cin >> g[i];
        g[i] = " " + g[i];
    }
    for (int i = 0; i < 2; i ++ )
    {
        for (int j = 1; j <= m; j ++ )
        {
            for (int k = 0; k <= x; k ++ )
            {
                dp[i][j][k] = 0;
            }
        }
    }
    int nw = 1;
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= m; j ++ )
        {
            for (int k = 0; k <= x; k ++ )
            {
                if (g[i][j] == '1') dp[nw][j][k] = max(dp[nw ^ 1][j][k], dp[nw][j - 1][k]) + 1;
                else if (g[i][j] == '?' && k != x) dp[nw][j][k] = max({dp[nw ^ 1][j][k], dp[nw][j - 1][k], dp[nw ^ 1][j][k + 1] + 1, dp[nw][j - 1][k + 1] + 1});
                else dp[nw][j][k] = max(dp[nw ^ 1][j][k], dp[nw][j - 1][k]);
            }
        }
        nw ^= 1;
    }
    cout << dp[nw ^ 1][m][0] << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem F. Art for Last(单调队列)

首先排序,选择长度为 k 的连续一段一定是最优的,每段的第一个数和最后一个数的差值就是最大差值值,最小差值怎么求呢?固定长度区间内的最小值,想到单调队列,于是做完

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    sort(a.begin() + 1, a.end());
    vector<int> minn(n + 1, INF);
    deque<int> q;
    for (int i = 2; i <= n; i ++ )
    {
        if (!q.empty() && i - q.front() >= k) q.pop_front();
        while (!q.empty() && a[q.back()] - a[q.back() - 1] >= a[i] - a[i - 1]) q.pop_back();
        q.push_back(i);
        minn[i] = a[q.front()] - a[q.front() - 1];
    }
    int ans = INF;
    for (int i = k; i <= n; i ++ )
    {
        ans = min(ans, (a[i] - a[i - k + 1]) * minn[i]);
    }
    cout << ans << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem G. Toxel 与字符画(大模拟)

首先一看就是个模拟,然后判断结果是否大于 1e18 可以用 int128 莽过去,结束!

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;
using i128 = __int128_t;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

char g[6][10][10][8];

void init()
{
    strcpy(g[0][0][0], "........");
    strcpy(g[0][0][1], "........");
    strcpy(g[0][0][2], "0000000.");
    strcpy(g[0][0][3], "0.....0.");
    strcpy(g[0][0][4], "0.....0.");
    strcpy(g[0][0][5], "0.....0.");
    strcpy(g[0][0][6], "0.....0.");
    strcpy(g[0][0][7], "0.....0.");
    strcpy(g[0][0][8], "0000000.");
    strcpy(g[0][0][9], "........");

    strcpy(g[0][1][0], "........");
    strcpy(g[0][1][1], "........");
    strcpy(g[0][1][2], "......1.");
    strcpy(g[0][1][3], "......1.");
    strcpy(g[0][1][4], "......1.");
    strcpy(g[0][1][5], "......1.");
    strcpy(g[0][1][6], "......1.");
    strcpy(g[0][1][7], "......1.");
    strcpy(g[0][1][8], "......1.");
    strcpy(g[0][1][9], "........");

    strcpy(g[0][2][0], "........");
    strcpy(g[0][2][1], "........");
    strcpy(g[0][2][2], "2222222.");
    strcpy(g[0][2][3], "......2.");
    strcpy(g[0][2][4], "......2.");
    strcpy(g[0][2][5], "2222222.");
    strcpy(g[0][2][6], "2.......");
    strcpy(g[0][2][7], "2.......");
    strcpy(g[0][2][8], "2222222.");
    strcpy(g[0][2][9], "........");

    strcpy(g[0][3][0], "........");
    strcpy(g[0][3][1], "........");
    strcpy(g[0][3][2], "3333333.");
    strcpy(g[0][3][3], "......3.");
    strcpy(g[0][3][4], "......3.");
    strcpy(g[0][3][5], "3333333.");
    strcpy(g[0][3][6], "......3.");
    strcpy(g[0][3][7], "......3.");
    strcpy(g[0][3][8], "3333333.");
    strcpy(g[0][3][9], "........");

    strcpy(g[0][4][0], "........");
    strcpy(g[0][4][1], "........");
    strcpy(g[0][4][2], "4.....4.");
    strcpy(g[0][4][3], "4.....4.");
    strcpy(g[0][4][4], "4.....4.");
    strcpy(g[0][4][5], "4444444.");
    strcpy(g[0][4][6], "......4.");
    strcpy(g[0][4][7], "......4.");
    strcpy(g[0][4][8], "......4.");
    strcpy(g[0][4][9], "........");

    strcpy(g[0][5][0], "........");
    strcpy(g[0][5][1], "........");
    strcpy(g[0][5][2], "5555555.");
    strcpy(g[0][5][3], "5.......");
    strcpy(g[0][5][4], "5.......");
    strcpy(g[0][5][5], "5555555.");
    strcpy(g[0][5][6], "......5.");
    strcpy(g[0][5][7], "......5.");
    strcpy(g[0][5][8], "5555555.");
    strcpy(g[0][5][9], "........");

    strcpy(g[0][6][0], "........");
    strcpy(g[0][6][1], "........");
    strcpy(g[0][6][2], "6666666.");
    strcpy(g[0][6][3], "6.......");
    strcpy(g[0][6][4], "6.......");
    strcpy(g[0][6][5], "6666666.");
    strcpy(g[0][6][6], "6.....6.");
    strcpy(g[0][6][7], "6.....6.");
    strcpy(g[0][6][8], "6666666.");
    strcpy(g[0][6][9], "........");

    strcpy(g[0][7][0], "........");
    strcpy(g[0][7][1], "........");
    strcpy(g[0][7][2], "7777777.");
    strcpy(g[0][7][3], "......7.");
    strcpy(g[0][7][4], "......7.");
    strcpy(g[0][7][5], "......7.");
    strcpy(g[0][7][6], "......7.");
    strcpy(g[0][7][7], "......7.");
    strcpy(g[0][7][8], "......7.");
    strcpy(g[0][7][9], "........");

    strcpy(g[0][8][0], "........");
    strcpy(g[0][8][1], "........");
    strcpy(g[0][8][2], "8888888.");
    strcpy(g[0][8][3], "8.....8.");
    strcpy(g[0][8][4], "8.....8.");
    strcpy(g[0][8][5], "8888888.");
    strcpy(g[0][8][6], "8.....8.");
    strcpy(g[0][8][7], "8.....8.");
    strcpy(g[0][8][8], "8888888.");
    strcpy(g[0][8][9], "........");

    strcpy(g[0][9][0], "........");
    strcpy(g[0][9][1], "........");
    strcpy(g[0][9][2], "9999999.");
    strcpy(g[0][9][3], "9.....9.");
    strcpy(g[0][9][4], "9.....9.");
    strcpy(g[0][9][5], "9999999.");
    strcpy(g[0][9][6], "......9.");
    strcpy(g[0][9][7], "......9.");
    strcpy(g[0][9][8], "9999999.");
    strcpy(g[0][9][9], "........");

    strcpy(g[1][0][0], "......");
    strcpy(g[1][0][1], "00000.");
    strcpy(g[1][0][2], "0...0.");
    strcpy(g[1][0][3], "0...0.");
    strcpy(g[1][0][4], "0...0.");
    strcpy(g[1][0][5], "00000.");
    strcpy(g[1][0][6], "......");
    strcpy(g[1][0][7], "......");
    strcpy(g[1][0][8], "......");
    strcpy(g[1][0][9], "......");

    strcpy(g[1][1][0], "......");
    strcpy(g[1][1][1], "....1.");
    strcpy(g[1][1][2], "....1.");
    strcpy(g[1][1][3], "....1.");
    strcpy(g[1][1][4], "....1.");
    strcpy(g[1][1][5], "....1.");
    strcpy(g[1][1][6], "......");
    strcpy(g[1][1][7], "......");
    strcpy(g[1][1][8], "......");
    strcpy(g[1][1][9], "......");

    strcpy(g[1][2][0], "......");
    strcpy(g[1][2][1], "22222.");
    strcpy(g[1][2][2], "....2.");
    strcpy(g[1][2][3], "22222.");
    strcpy(g[1][2][4], "2.....");
    strcpy(g[1][2][5], "22222.");
    strcpy(g[1][2][6], "......");
    strcpy(g[1][2][7], "......");
    strcpy(g[1][2][8], "......");
    strcpy(g[1][2][9], "......");

    strcpy(g[1][3][0], "......");
    strcpy(g[1][3][1], "33333.");
    strcpy(g[1][3][2], "....3.");
    strcpy(g[1][3][3], "33333.");
    strcpy(g[1][3][4], "....3.");
    strcpy(g[1][3][5], "33333.");
    strcpy(g[1][3][6], "......");
    strcpy(g[1][3][7], "......");
    strcpy(g[1][3][8], "......");
    strcpy(g[1][3][9], "......");

    strcpy(g[1][4][0], "......");
    strcpy(g[1][4][1], "4...4.");
    strcpy(g[1][4][2], "4...4.");
    strcpy(g[1][4][3], "44444.");
    strcpy(g[1][4][4], "....4.");
    strcpy(g[1][4][5], "....4.");
    strcpy(g[1][4][6], "......");
    strcpy(g[1][4][7], "......");
    strcpy(g[1][4][8], "......");
    strcpy(g[1][4][9], "......");

    strcpy(g[1][5][0], "......");
    strcpy(g[1][5][1], "55555.");
    strcpy(g[1][5][2], "5.....");
    strcpy(g[1][5][3], "55555.");
    strcpy(g[1][5][4], "....5.");
    strcpy(g[1][5][5], "55555.");
    strcpy(g[1][5][6], "......");
    strcpy(g[1][5][7], "......");
    strcpy(g[1][5][8], "......");
    strcpy(g[1][5][9], "......");

    strcpy(g[1][6][0], "......");
    strcpy(g[1][6][1], "66666.");
    strcpy(g[1][6][2], "6.....");
    strcpy(g[1][6][3], "66666.");
    strcpy(g[1][6][4], "6...6.");
    strcpy(g[1][6][5], "66666.");
    strcpy(g[1][6][6], "......");
    strcpy(g[1][6][7], "......");
    strcpy(g[1][6][8], "......");
    strcpy(g[1][6][9], "......");

    strcpy(g[1][7][0], "......");
    strcpy(g[1][7][1], "77777.");
    strcpy(g[1][7][2], "....7.");
    strcpy(g[1][7][3], "....7.");
    strcpy(g[1][7][4], "....7.");
    strcpy(g[1][7][5], "....7.");
    strcpy(g[1][7][6], "......");
    strcpy(g[1][7][7], "......");
    strcpy(g[1][7][8], "......");
    strcpy(g[1][7][9], "......");

    strcpy(g[1][8][0], "......");
    strcpy(g[1][8][1], "88888.");
    strcpy(g[1][8][2], "8...8.");
    strcpy(g[1][8][3], "88888.");
    strcpy(g[1][8][4], "8...8.");
    strcpy(g[1][8][5], "88888.");
    strcpy(g[1][8][6], "......");
    strcpy(g[1][8][7], "......");
    strcpy(g[1][8][8], "......");
    strcpy(g[1][8][9], "......");

    strcpy(g[1][9][0], "......");
    strcpy(g[1][9][1], "99999.");
    strcpy(g[1][9][2], "9...9.");
    strcpy(g[1][9][3], "99999.");
    strcpy(g[1][9][4], "....9.");
    strcpy(g[1][9][5], "99999.");
    strcpy(g[1][9][6], "......");
    strcpy(g[1][9][7], "......");
    strcpy(g[1][9][8], "......");
    strcpy(g[1][9][9], "......");

    strcpy(g[2][0][0], "........");
    strcpy(g[2][0][1], "........");
    strcpy(g[2][0][2], "........");
    strcpy(g[2][0][3], "........");
    strcpy(g[2][0][4], "=======.");
    strcpy(g[2][0][5], "........");
    strcpy(g[2][0][6], "=======.");
    strcpy(g[2][0][7], "........");
    strcpy(g[2][0][8], "........");
    strcpy(g[2][0][9], "........");

    strcpy(g[3][0][0], "........");
    strcpy(g[3][0][1], "........");
    strcpy(g[3][0][2], "IIIIIII.");
    strcpy(g[3][0][3], "...I....");
    strcpy(g[3][0][4], "...I....");
    strcpy(g[3][0][5], "...I....");
    strcpy(g[3][0][6], "...I....");
    strcpy(g[3][0][7], "...I....");
    strcpy(g[3][0][8], "IIIIIII.");
    strcpy(g[3][0][9], "........");

    strcpy(g[4][0][0], "........");
    strcpy(g[4][0][1], "........");
    strcpy(g[4][0][2], "N.....N.");
    strcpy(g[4][0][3], "NN....N.");
    strcpy(g[4][0][4], "N.N...N.");
    strcpy(g[4][0][5], "N..N..N.");
    strcpy(g[4][0][6], "N...N.N.");
    strcpy(g[4][0][7], "N....NN.");
    strcpy(g[4][0][8], "N.....N.");
    strcpy(g[4][0][9], "........");

    strcpy(g[5][0][0], "........");
    strcpy(g[5][0][1], "........");
    strcpy(g[5][0][2], "FFFFFFF.");
    strcpy(g[5][0][3], "F.......");
    strcpy(g[5][0][4], "F.......");
    strcpy(g[5][0][5], "FFFFFFF.");
    strcpy(g[5][0][6], "F.......");
    strcpy(g[5][0][7], "F.......");
    strcpy(g[5][0][8], "F.......");
    strcpy(g[5][0][9], "........");
}

void solve()
{
	string s;
    cin >> s;
    int st = 0;
    int a = 0, b = 0;
    for (int i = 0; i < s.size(); i ++ )
    {
        if (s[i] == '{' || s[i] == '^')
        {
            st = 1;
            continue;
        }
        else if (s[i] == '}') break;
        if (st == 0) a = a * 10 + (s[i] - '0');
        else b = b * 10 + (s[i] - '0');
    }
    st = 0;
    string ans;
    i128 res = 1;
    if (a == 1) res = 1;
    else
    {
        for (int i = 0; i < b; i ++ )
        {
            res = res * a;
            if (res > 1e18)
            {
                res = -1;
                break;
            }
        }
    }
    if (res == -1) ans = "INF";
    else
    {
        int tmp = res;
        ans = to_string(tmp);
    }
    s = s + "=" + ans;
    for (int i = 0; i < 10; i ++ )
    {
        cout << '.';
        for (int j = 0; j < s.size(); j ++ )
        {
            if (s[j] == '{' || s[j] == '^')
            {
                st = 1;
                continue;
            }
            else if (s[j] == '}')
            {
                st = 0;
                continue;
            }
            if (s[j] == '=')
            {
                for (int k = 0; k < 8; k ++ ) cout << g[2][0][i][k];
                continue;
            }
            else if (s[j] == 'I')
            {
                for (int k = 0; k < 8; k ++ ) cout << g[3][0][i][k];
                continue;
            }
            else if (s[j] == 'N')
            {
                for (int k = 0; k < 8; k ++ ) cout << g[4][0][i][k];
                continue;
            }
            else if (s[j] == 'F')
            {
                for (int k = 0; k < 8; k ++ ) cout << g[5][0][i][k];
                continue;
            }
            int num = s[j] - '0';
            if (st == 0) for (int k = 0; k < 8; k ++ ) cout << g[st][num][i][k];
            else if (st == 1) for (int k = 0; k < 6; k ++ ) cout << g[st][num][i][k];
        }
        cout << '\n';
    }
    cout << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

    init();

	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem H. Travel Begins(贪心)

  • 最大值:前 k-1 个数选 0.5,剩下的丢给最后一个数

  • 最小值:前 k-1 个数选 0.4999999,极限可以当做 0.5 计算,剩下的丢给最后一个数

需要注意一下选 k-1 个 0.5 超过 n 的情况

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;
using i128 = __int128_t;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve1(int n, int k)
{
    double tmp1 = 0.5 * (k - 1);
    int ans2 = n - tmp1;
    int ans =0;
    if (n - tmp1 - ans2 >= 0.5) ans ++ ;
    ans += ans2;
    cout << max((i64)0, (int)ans) << ' ';
}

void solve2(int n, int k)
{
    double tmp1 = 0.5 * (k - 1);
    if (n < tmp1)
    {
        int ans1 = n / 0.5;
        cout << ans1 << '\n';
    }
    else
    {
        int ans2 = n - tmp1;
        int ans = k - 1;
        if (n - tmp1 - ans2 >= 0.5) ans ++ ;
        ans += ans2;
        cout << ans << '\n';
    }
}

void solve()
{
	int n, k;
    cin >> n >> k;
    solve1(n, k);
    solve2(n, k);
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

Problem K. 排列与质数(思维)

找不到啥规律,想到升序排列奇数,降序排列偶数

发现不满足条件的只有两个地方,中间交界的地方 n-1,末尾的 2

2 放在 5 7 之间非常合适,于是挪过去,1 和 4 也符合条件

n - 1 可以放在 n - 4 和 n - 6 之间

特判一下不能用这个方法的情况,即 n<6 n=8 n=11

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;
using i128 = __int128_t;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	int n;
    cin >> n;
    if (n <= 4) cout << -1 << '\n';
    else if (n == 5) cout << "4 1 3 5 2\n";
    else if (n == 6) cout << "1 6 3 5 2 4\n";
    else if (n == 8) cout << "1 3 5 7 2 4 6 8\n";
    else if (n == 11) cout << "1 3 10 5 2 7 9 11 8 6 4\n";
    else
    {
        if (n & 1)
        {
            for (int i = 1; i <= n; i += 2)
            {
                cout << i << ' ';
                if (i == 5) cout << 2 << ' ';
                if (i == n - 6) cout << n - 1 << ' ';
            }
            for (int i = n - 3; i >= 4; i -= 2) cout << i << ' ';
            cout << '\n';
        }
        else
        {
            for (int i = 1; i <= n - 2; i += 2)
            {
                cout << i << ' ';
                if (i == 5) cout << 2 << ' ';
            }
            for (int i = n; i >= 4; i -= 2)
            {
                cout << i << ' ';
                if (i == n - 4) cout << n - 1 << ' ';
            }
            cout << '\n';
        }
    }
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}
  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考 程序设计竞赛相关代码、设计文档、使用说明,供学习参考

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Texcavator

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值