AcWing——第80场周赛

101 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

AcWing——第80场周赛

4725. 末尾字母 - AcWing题库

给定一个由大小写字母、空格和问号组成的字符串。

请你判断字符串中的最后一个字母是否是元音字母。

我们认为元音字母共有 6 个,分别为:A、E、I、O、U、Y(当然还有它们的小写)。

输入格式

一个由大小写字母、空格和问号组成的字符串。

保证问号在字符串中恰好出现一次,且一定出现在最后。

字符串中至少包含一个字母。

输出格式

如果字符串中的最后一个字母是元音字母,则输出 YES,否则输出 NO

注意,我们问的是最后一个字母,而不是最后一个字符,空格和问号不算作字母。

数据范围

所有测试点满足,输入字符串的长度范围 [2,100]。

输入样例1:

Is it a melon?

输出样例1:

NO

问题解析

要注意题目给的是一个句子,单纯使用cin读入字符串只会读到第一个字符串。

所以要采用:getline(cin, s);的方式读入一整行。

遍历字符串找最后一个字符,再判断它是不是元音字母就行。

AC代码

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include <random>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<fstream>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#include<bitset>//#pragma GCC optimize(2)
//#pragma GCC optimize(3)#define endl '\n'
#define int ll
#define PI acos(-1)
#define INF 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PII;
const int N = 2e5 + 50, MOD = 1e9 + 7;
​
void solve()
{
    string s;
    getline(cin, s);
    char c;
    unordered_map<char, int>mymap;
    mymap['A'] = mymap['E'] = mymap['I'] = mymap['O'] = mymap['U'] = mymap['Y'] = mymap['a'] = mymap['e'] = mymap['i'] = mymap['o'] = mymap['u'] = mymap['y']= 1;
    for (auto& i : s)
    {
        if (i >= 'a' && i <= 'z')c = i;
        else if (i >= 'A' && i <= 'Z')c = i;
    }
    if (mymap.count(c))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
​
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
​
    //cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

4726. 寻找数字 - AcWing题库

给定一个正整数 n,请你找到一个正整数 x,要求:

  1. x≥n
  2. x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
  3. 满足前两个条件的前提下,x 应尽可能小。

输入格式

一个正整数 n。

输出格式

一个正整数,表示 x。

数据范围

前 6 个测试点满足 1≤n≤5000。 所有测试点满足 1≤n≤10^9。

输入样例1:

4500

输出样例1:

4747

问题解析

可以注意到n最大是1e9,也就是10位数。

那么我们可以递归的构造出1位数到10位数中所有只由4和7组成的数,相当于10个位置每个位置可以选择填4或7,每个位置两个选择,那么一共的结果数就是1024种。

在这些数里面挑选大于等于n的,并在里面记录最小值。

AC代码

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include <random>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<fstream>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#include<bitset>//#pragma GCC optimize(2)
//#pragma GCC optimize(3)#define endl '\n'
#define int ll
#define PI acos(-1)
#define INF 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PII;
const int N = 2e5 + 50, MOD = 1e9 + 7;
​
int n,mn=1e10;
​
void dfs(int u, int num, int cnt4, int cnt7)
{
    if (u > 10)return;
    if (cnt4 != 0 && cnt4 == cnt7)
    {
        if(num>=n)
            mn=min(mn,num);
    }
    dfs(u + 1, num * 10 + 4, cnt4 + 1, cnt7);
    dfs(u + 1, num * 10 + 7, cnt4, cnt7 + 1);
}
​
void solve()
{
    cin >> n;
    dfs(0, 0, 0, 0);
    cout << mn << endl;
}
​
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
​
    //cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

4727. 摆放棋子 - AcWing题库

给定 n1 个完全相同的黑色棋子和 n2 个完全相同的白色棋子。

请你将所有棋子摆成一排。

在所有棋子都摆放好后,需满足:

  1. 不得有超过 k1 (即大于 k1)个黑色棋子连续相邻的排在一起。
  2. 不得有超过 k2 (即大于 k2)个白色棋子连续相邻的排在一起。

请问一共有多少种不同的摆放方法。

由于结果可能很大,你只需要输出对 108108 取模后的结果。

输入格式

共一行,包含 4 个整数 n1,n2,k1,k2。

输出格式

输出满足要求的摆放方法数量对 10^8 取模后的结果。

数据范围

前 4 个测试点满足 1≤n1,n2≤10。 所有测试点满足 1≤n1,n2≤100,1≤k1,k2≤10。

输入样例1:

2 1 1 10

输出样例1:

1

问题解析

设立三维动态转移数组f,f[i] [j] [k]的意思是:前 i 个棋子,j 个白棋,最后填的是k棋子(k为0是黑,为1是白).

有状态转移方程:

  • f[i] [j] [1] = (f[i] [j] [1]+f[i−a] [j−a] [0])%MOD;
  • f[i] [j] [0]=(f[i] [j] [0]+f[i−a] [j] [1])%MOD;

最后的结果为:f[n] [n2] [0]+f[n] [n2] [1]

AC代码

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include <random>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<fstream>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#include<bitset>
​
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)#define endl '\n'
#define int ll
#define PI acos(-1)
#define INF 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PII;
const int N = 2e2 + 50, MOD = 1e8;
​
int f[N][N][2];
void solve()
{
    int n1, k1, n2, k2;
    cin >> n1 >> n2 >> k1 >> k2;
    f[0][0][0] = f[0][0][1] = 1;  
    int n = n1 + n2;   
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= n2 && j <= i; ++j) {
            if (i > n1 + j) continue;
            for (int a = 1; a <= j && a <= k2; ++a) {
                f[i][j][1] = (f[i][j][1] + f[i - a][j - a][0]) % MOD;
            }
            for (int a = 1; j + a <= i && a <= k1; ++a) {
                f[i][j][0] = (f[i][j][0] + f[i - a][j][1]) % MOD;
            }
        }
    }
    cout << (f[n][n2][0] + f[n][n2][1]) % MOD << endl;
}
​
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
​
    //cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}