真题

还是要注意自己构建数据测试。

最大连续子序列

前缀和

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector<int> P(n);
    for(int i = 0; i<n;i++){
        cin >> P[i];
    }
    vector<int> prefix(n);
    prefix[0] = P[0];
    for(int i =1;i<n;i++){
        prefix[i] = prefix[i-1]+P[i];
    }
    //for(int x:prefix)cout << x << " ";
    //cout << endl;
    int minidx = 0;
    int maxidx = 0;

    for(int i = 0; i<n;i++){
        if(prefix[maxidx]<prefix[i]){
            maxidx = i;//最大前缀和
        }
    }    
    for(int i = 0; i<maxidx;i++){
        if(prefix[minidx]>prefix[i]){//找最小前缀和且在最大前缀和之前
            minidx = i;
        }
    }   
    //cout << maxidx << " " << minidx << " ";

    if(prefix[minidx]<0&&minidx!=maxidx){//小于0且两个不相等
        cout << prefix[maxidx] - prefix[minidx];
        return 0;
    }else{
        cout << prefix[maxidx];
        return 0;
    }

    return 0;
}

众数问题

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector<int> P(n);
    for(int i = 0; i < n; i++){
        cin >> P[i];
    }
    sort(P.begin(),P.end());
    vector<int> fp;
    int now = P[0];
    int c = 0;
    fp.push_back(0);
    for(int i = 1; i < n; i++){
        if(now!=P[i]){
            now = P[i];
            fp.push_back(i);
        }
    }    
    //差最大的就是最多的
    int m = fp[0];
    int idx = 0;
    for (int i = 1; i <fp.size() ; i++)
    {
        //cout<<fp[i]<<" ";
        if(m<fp[i]-fp[i-1]){
            m = fp[i]-fp[i-1];
            idx = fp[i-1];
        }
    }
    cout<<P[idx];
    return 0;
}

A 与 B 得到 C

签到

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if(a+b==c||a-b==c||a*b==c){
        cout << "YES";
    }else{
        if(b!=0){
            if(a/b==c){
                cout <<"YES";
                return 0;
            }
        }
        cout << "NO";
    }
    return 0;
}

一元一次方程

字符串处理,处理左边和右边的系数然后解决就行。

    #include <iostream>
    #include <algorithm>

    using namespace std;

    int main() {
        string fc;
        cin >> fc;
        int lx = 0;
        int rx = 0;
        int lc = 0;
        int rc = 0;

        int p = 0;
        int flag = 1;

        while(fc[p]!='='){
            if(fc[p]<='9'&&fc[p]>='0'){
                if(p>0){
                    flag = fc[p-1]=='+'?1:-1;
                }//判断符号
                int now = p;
                while(fc[now]!='x'&&fc[now]!='+'&&fc[now]!='-'&&fc[now]!='='){
                    now++;
                }//判断是x还是常数
                int num = 0;
                num += fc[p] - '0';
                p++;
                while(p<now){
                    num *= 10;
                    num += fc[p] - '0';
                    p++;
                }//计算对应数字
                if(fc[now]=='x'){
                    lx += flag * num;
                }else{
                    lc += flag * num;
                }
            }
            else if(fc[p]=='x'){
                if(p>0){
                    flag = fc[p-1]=='+'?1:-1;
                }
                lx += flag * 1;
            }
            if(fc[p]=='='){
                break;
            }
            p++;
        }
        p++;
        flag = 1;
        while(fc[p]!='\0'){
            if(fc[p]<='9'&&fc[p]>='0'){
                if(fc[p-1]!='='){
                    flag = fc[p-1]=='+'?1:-1;
                }//判断符号
                int now = p;
                while(fc[now]!='x'&&fc[now]!='+'&&fc[now]!='-'&&fc[now]!='\0'){
                    now++;
                }//判断是x还是常数
                int num = 0;
                num += fc[p] - '0';
                p++;
                while(p<now){
                    num *= 10;
                    num += fc[p] - '0';
                    p++;
                }//计算对应数字
                if(fc[now]=='x'){
                    rx += flag * num;
                }else{
                    rc += flag * num;
                }
            }
            else if(fc[p]=='x'){
                if(fc[p-1]!='='){
                    flag = fc[p-1]=='+'?1:-1;
                }
                rx += flag * 1;
            }
            if(fc[p]=='\0')break;
            p++;
        }
        int x;
        x = lx - rx;
        int c;
        c = rc - lc;
        if(x==0&&c!=0){
            cout << "no solution";
            return 0;
        }
        if(x==0&&c==0){
            cout << "infinite solutions";
            return 0;
        }
        x = c/x;
        cout << "x="<<x;
        return 0;
    }

前中后遍历

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;
//前中后,根左右

struct Node{
    int L;
    int R;
};

int root;
vector<Node> P;
vector<int> prep, midp, hindp;
void pre(int root){
    if(root == -1)return;
    prep.push_back(root);
    pre(P[root].L);
    pre(P[root].R);
}

void mid(int root){
    if(root == -1)return;
    mid(P[root].L);
    midp.push_back(root);
    mid(P[root].R);
}

void hind(int root){
    if(root == -1)return;
    hind(P[root].L);
    hind(P[root].R);
    hindp.push_back(root);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;
    P.resize(n);
    int F,L,R;
    vector<bool> isroot(n,true);
    for(int i = 0; i < n; i++){
        cin >> F >> L >> R;
        P[F].L = L;
        P[F].R = R;
        if(L!=-1)isroot[L] = false;
        if(R!=-1)isroot[R] = false;       
    }
    for(int i = 0; i < n; i++){
        if(isroot[i]){
            root = i;
            break;
        }
    }    
    pre(root);
    mid(root);
    hind(root);
    for(int x:prep)cout << x << " ";
    cout <<endl;
    for(int x:midp)cout << x << " ";
    cout <<endl;
    for(int x:hindp)cout << x << " ";
    cout <<endl;
    return 0;
}

跳台阶问题

#include <iostream>

using namespace std;
int c=0;

void check(int x){
    if(x==1){
        c+=1;
        return;
    }
    if(x==2){
        c+=2;
        return;
    }
    check(x-1);
    //c+=1;
    check(x-2);
    //c+=1;
}

int main() {
    int n;
    cin >> n;
    check(n);
    cout << c;
    return 0;
}

我这个是全局变量方法。还可以用dp方法。

#include <iostream>
#include <vector>
using namespace std;

vector<int> P;

void check(int x){
    P[0] = 0;
    P[1] = 1;
    P[2] = 2;
    for(int i = 3; i <= x; i++){
        P[i] = P[i-1] + P[i-2];
    }
}

int main() {
    int n;
    cin >> n;
    P.resize(n+1);
    check(n);
    cout << P[n];
    return 0;
}
posted @ 2025-08-25 14:05  .N1nEmAn  阅读(14)  评论(0)    收藏  举报