A:小A的糖果
知识点:贪心
思路:如果相邻两个盒子糖果的数量大于 x,就吃右边盒子的糖,否则不进行任何操作。这是因为如果我们吃掉左边盒子里的糖,就只会减少这一轮相邻两个盒子糖果的数量;如果我们吃掉右边盒子里的糖,那么这次操作还可以减少下一轮相邻两个盒子糖果的数量,符合贪心的逻辑。
参考代码:
#include<bits/stdc++.h>
using namespace std;
long long n,x,a[200001],ans;
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
if(a[i]+a[i-1]>x){
ans+=a[i]-(x-a[i-1]);
a[i]=x-a[i-1];
}
}
cout<<ans;
return 0;
}
B:使括号有效的最少添加
知识点:字符串匹配、栈
思路:考虑到需要进行括号匹配,可以定义一个左括号计数器,一个右括号计数器,若遇到了左括号,就统计,若是遇到了右括号就进行匹配,若是左括号计数器有数据,则减少一个进行匹配,否则不能匹配答案增加一个,等到走完再把不能匹配的左括号累加到答案即可。
代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int main() {
cin>>s;
int ans=0,l=0;
for(int i=0; i<s.size(); i++) {
if(s[i]=='(') {
l++;
} else {
if(l)l--;
else ans++;
}
}
ans+=l;
cout<<ans;
return 0;
}
C:寻找匹配单词
知识点:枚举、搜索与回溯
思路:枚举每个与开头单词相同字符的位置,记得情况标记数组,从匹配位置开始,第1个位置开始进行搜索,若搜索到第单词长度个位置,则结束了,返回成功,否则四个方向进行枚举,注意不要越界,该位置未被标记,单词与下一个位置单词匹配,然后进行标记,搜索,再反标记。
代码:
#include<bits/stdc++.h>
using namespace std;
char board[22][22];
string word;
int n,m;
int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // 方向数组
bool v[20][20] = {};
bool dfs(int x, int y, int p) {
// 搜索到了x,y的位置,接下来该匹配第p个单词了
if (word.size() == p)
return 1; // 匹配了s个单词了
for (int i = 0; i < 4; i++) {
int xx = x + d[i][0], yy = y + d[i][1];
if (xx >= 0 && xx < n && yy >= 0 && yy < m
&& v[xx][yy] == 0 && word[p] == board[xx][yy]) {
v[xx][yy] = 1;
if (dfs(xx, yy, p + 1))
return 1;
v[xx][yy] = 0;
}
}
return 0;
}
bool exist() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
memset(v, 0, sizeof(v)); // 清空标记数组
if (board[i][j] == word[0]) { // 起点相同
v[i][j] = 1; // 先标记起点
if (dfs(i, j, 1)) // 可以从i,j的位置进行搜索,接下来该匹配第1个位置了
return 1;
}
}
}
return 0;
}
int main() {
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>board[i][j];
cin>>word;
cout<<exist();
return 0;
}
D:小凯的疑惑
知识点:数学、方程
思路:这道题目是一道数学定理——赛瓦维斯特定理:已知a,b为大于1的正整数,a和b互为素数,则使不定方程ax+by=C无负整数解的最大整数C=ab−a−b!
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b;
cin>>a>>b;
cout<<a*b-a-b;
return 0;
}