开启掘金成长之旅!这是我参与「掘金日新计划 · 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,要求:
- x≥n
- x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
- 满足前两个条件的前提下,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 个完全相同的白色棋子。
请你将所有棋子摆成一排。
在所有棋子都摆放好后,需满足:
- 不得有超过 k1 (即大于 k1)个黑色棋子连续相邻的排在一起。
- 不得有超过 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;
}