A Matching
题目大意:给定一个只包含数字和问号的字符串,问号表示可以替换成任意一个数字,问号和数字可以组成一个正整数,但这个正整数不能以 0 开头。你的任务是计算有多少个正整数可以由该字符串替换问号得到。
解题思路:贪心,如果是首位是?则*9,其他地方则*10;
参考代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
if (s[0] == '0') {
cout << 0 << endl;
continue;
}
int sum = 1;
if (s[0] == '?') sum *= 9;
for (int i = 1; i < s.size(); i++) {
if (s[i] == '?') sum *= 10;
}
cout << sum << endl;
}
return 0;
}
题目大意:这道题的意思是给定一个长度为 n 的数组 a 和一个经过排序后的数组 a',求出 a 中一个子区间 [l,r],满足将 $[l,r]$排序后得到的数组等于 a',且[l,r]的长度最长。
解题思路:思路可以先找到 a 中最左侧与最右侧不同于 a' 的位置 l 和 r,然后在 [l,r] 中找到 $a[l,r]$ 的最大值和最小值 max 和 min。再找到 a'中第一个 max 和 min 的位置 p 和q,那么 [l,r] 就为 [p,q]。
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5 + 5;
int T, n;
int a[N], b[N];
int main() {
cin >> T;
while (T--) {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
int mi = N, ma = 0;
int l, r;
for (int i = 1; i <= n; i++) {
if (a[i] != b[i]) {
l = i;
break;
}
}
for (int i = n; i >= 1; i--) {
if (a[i] != b[i]) {
r = i;
break;
}
}
for (int i = l; i <= r; i++) {
mi = min(mi, a[i]);
ma = max(ma, a[i]);
}
while (l > 1) {
if (a[l - 1] <= mi) {
mi = a[l - 1];
l--;
} else break;
}
while (r < n) {
if (a[r + 1] >= ma) {
ma = a[r + 1];
r++;
} else break;
}
cout << l << ' ' << r << endl;
}
return 0;
}
题目大意:给定一个由小写字母组成的字符串,每次可以选择一些不相邻的位置,删除这些位置上的字母,并将剩下的部分连接起来。求最少需要多少次这样的操作,才能使整个字符串中的所有字母都相同。
解题思路:
参考代码:
D
题目大意:
解题思路:
参考代码:
E
题目大意:
解题思路:
参考代码: