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;
}
Copyright ©图灵之星 2024,转载需注明出处该文件修订时间: 2025-03-15 22:17:28

results matching ""

    No results matching ""