A. Vasya and Coins
题意:
给定 a a a 个一元硬币和 b b b 个二元硬币,求最小不能支付的金额。
思路:
若 a > 0 a > 0 a>0,则可以支付出所有不大于 a + 2 ∗ b a + 2 * b a+2∗b 的金额;否则,无法支付出 1 1 1 的金额。
代码:
void solve() {
ll a, b;
cin >> a >> b;
if(!a) {
cout << "1\n";
return;
}
cout << a + 2 * b + 1 << "\n";
}
B. Vlad and Candies
题意:
给定 n n n 个种类的糖果的颗数,每次只能选择当前数量最多的糖果且不能连续吃两颗相同种类的糖果,问是否能把糖果吃完。
思路:
定义一个集合,每次循环选择集合内的糖果。首先加入数量最多的糖果,接下来在吃糖果的过程中加入任何与集合内糖果的数量相差不超过 1 1 1 的糖果。因此,只需考虑最多的两种糖果(如果存在的话)相差是否大于 1 1 1 即可。
代码:
void solve() {
int n;
cin >> n;
vector<ll> a(n);
for(int i = 0; i < n; ++i) {
cin >> a[i];
}
if(n == 1) {
if(a[0] > 1) cout << "NO\n";
else cout << "YES\n";
return;
}
sort(a.begin(), a.end(), greater<ll>());
if(a[0] - a[1] > 1) {
cout << "NO\n";
} else {
cout << "YES\n";
}
}
C. Get an Even String
题意:
定义一个字符串为偶串,当且仅当该字符串形如 a a b b c c d d … … aabbccdd…… aabbccdd……。给定一个字符串,求将其变为偶串最小删除字符的数量。
思路:
采用dp,定义 d p [ i ] dp[i] dp[i] 为前 i i i 个字符最大保留字符的数量,则答案为 n − d p [ n ] n - dp[n] n−dp[n]。
可以预处理出每个字符上一个与它相等的字符的位置,状态转移方程为:
d p [ i ] = m a x ( d p [ i − 1 ] , d p [ p r e [ i ] − 1 ] + 2 ) dp[i] = max(dp[i - 1], dp[pre[i] - 1] + 2) dp[i]=max(dp[i−1],dp[pre[i]−1]+2)
代码:
void solve() {
string s;
cin >> s;
int n = s.size();
s = " " + s;
vector<int> pos(26), pre(n + 1);
for(int i = 1; i <= n; ++i) {
pre[i] = pos[s[i] - 'a'];
pos[s[i] - 'a'] = i;
}
vector<int> dp(n + 1);
for(int i = 1; i <= n;