CSU1222/1226/1233/1236/1239/1240/1785/1729/1753/1715/1643/1628

本文精选了一系列C++编程技巧,包括高效求解数学问题、字符串处理、矩阵运算、数据结构操作等,通过实际代码示例展示了如何解决特定问题。

A

#include <bits/stdc++.h>
#define N 100100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int arr[N][2];
int main()
{
    ios::sync_with_stdio(false);
    int n;
    LL ans;
    while(cin>>n){
        ans=0;
        for(int i=0;i<=n;++i){
            cin>>arr[i][0]>>arr[i][1];
        }
        for(int i=1;i<=n;++i){
            ans+=abs(arr[i][0]-arr[i-1][0])+abs(arr[i][1]-arr[i-1][1]);
        }
        cout<<ans<<endl;
    }
    return 0;
}

B

使用两个map\

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    map<char,int> countto,countfrom;
    map<char,char> mpto,mpfrom;
    string line1,line2,temp;
    bool ok;
    while(cin>>line1){
        mpto.clear(),mpfrom.clear();
        countto.clear(),countfrom.clear();
        cin>>line2;
        for(int i=0;i<line1.size();++i){
            if(mpto[line1[i]]!=line2[i]){
                ++countto[line1[i]];
            }
            mpto[line1[i]]=line2[i];
            if(mpfrom[line2[i]]!=line1[i]){
                ++countfrom[line2[i]];
            }
            mpfrom[line2[i]]=line1[i];
        }
        /*for(auto a=mpto.begin(),b=mpto.end();a!=b;++a){
            cout<<a->first<<' '<<a->second<<end;
        }*/

        temp.clear();
        ok=true;
        cin>>line1;
        for(int i=0;i<line1.size();++i){
            if(countto[line1[i]]==1){
                temp+=mpto[line1[i]];
            }else{
                ok=false;
            }
        }
        if(ok){
            cout<<temp<<endl;
        }else{
            cout<<"Wrong"<<endl;
        }
        temp.clear();
        ok=true;
        cin>>line1;
        for(int i=0;i<line1.size();++i){
            if(countfrom[line1[i]]==1){
                temp+=mpfrom[line1[i]];
            }else{
                ok=false;
            }
        }
        if(ok){
            cout<<temp<<endl;
        }else{
            cout<<"Wrong"<<endl;
        }
    }
    return 0;
}

D

矩阵快速幂

顺便不要看错位置……

#include <bits/stdc++.h>
#define N 10100
#define SIZE 2
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
struct Matrix{
    LL a[SIZE][SIZE];
    Matrix()=default;
    Matrix(LL n){
        memset(a,0,sizeof(a));
        for(LL i=0;i<SIZE;++i){
            this->a[i][i]=n;
        }
    }
    Matrix operator*(Matrix &a){
        Matrix b;
        for(LL i=0;i<SIZE;++i){
            for(LL j=0;j<SIZE;++j){
                b.a[i][j]=0;
                for(LL k=0;k<SIZE;++k){
                    b.a[i][j]+=this->a[i][k]*a.a[k][j];
                }
            }
        }
        return b;
    }
    void print(){
        for(LL i=0;i<SIZE;++i){
            for(LL j=0;j<SIZE;++j){
                cout<<this->a[i][j]<<' ';
            }
            cout<<endl;
        }
    }
};
Matrix MatriMulti(Matrix &a,Matrix &b,LL mod)
{
    Matrix c;
    for(LL i=0;i<SIZE;++i){
        for(LL j=0;j<SIZE;++j){
            c.a[i][j]=0;
            for(LL k=0;k<SIZE;++k){
                c.a[i][j]+=a.a[i][k]*b.a[k][j];
            }
            c.a[i][j]%=mod;
        }
    }
    //c.print();
    return c;
}
Matrix MatriPow(Matrix a,LL n,LL mod) 
{
    Matrix c(1);
    //a.print();
    //c.print();
    while(n){
        if(n&1){
            c=MatriMulti(a,c,mod);
            n-=1;
        }
        a=MatriMulti(a,a,mod);
        n>>=1;
    }
    //c.print();
    return c;
}
int main()
{
    ios::sync_with_stdio(false);
    Matrix m;
    LL r,s,t;
    while(cin>>r>>s>>m.a[0][0]>>m.a[1][0]>>m.a[0][1]>>m.a[1][1]>>t){
        m=MatriPow(m,t,1000003);
        //m.print(); 
        cout<<(r*(m.a[0][0]+m.a[1][0])+s*(m.a[0][1]+m.a[1][1]))%1000003<<endl;
    }
    return 0;
}
/**********************************************************************
    Problem: 1233
    User: CSUzick
    Language: C++
    Result: AC
    Time:0 ms
    Memory:1688 kb
**********************************************************************/

E

就是之前基础题里面删数反着来就好了,记得前导零不输出但是后缀零要输出

#include <bits/stdc++.h>
#define N 2020
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int pre[N],post[N];
char num[N];
void init(int n)
{
    pre[0]=0;
    post[0]=1;
    for(int i=1;i<n;++i){
        pre[i]=i-1;
        post[i]=i+1;
    }
}
int main()
{
    int d,n,pos,kase;
    while(~scanf("%s%d",num,&d)){
        kase=0;
        pos=0;
        n=strlen(num);
        init(n);
        while(d){
            if(num[pre[pos]]>num[pos]){
                pos=pre[pos];
            }
            if(post[pos]<n){
                if(num[pos]>num[post[pos]]){
                    num[pos]=0;
                    post[pre[pos]]=post[pos];
                    if(pre[pos]==pos){
                        pre[post[pos]]=post[pos];
                    }else{
                        pre[post[pos]]=pre[pos];
                    }
                    --d;
                }
                pos=post[pos];
            }else{
                while(d){
                    num[pos]=0;
                    pos=pre[pos];
                    --d;
                }
            }
        }
        for(int i=0;i<n;++i){
            if(num[i]&&num[i]!='0'||(num[i]=='0'&&kase)){
                cout<<num[i];
                ++kase; 
            }
        }
        if(!kase){
            cout<<0;
        } 
        cout<<endl;
    }
    return 0;
}

F

就是对中文用KMP嘛

不过我花了好久时间找wchar/u32char/u16char然后没有成功,心疼自己的智商……

#include <iostream>
#include <string>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
#include<bits/stdc++.h> 
string str1,str2;
int pi[20100]={0};
void KMP();
int main()
{
    int k,n,m,t,cnt=0,i,j;
    while(cin>>str2){
        cin>>str1;
        KMP();
        m=str2.size()/2;
        /*for(int i=0;i<m;++i){
            cout<<pi[i]<<' ';
        }cout<<endl;*/
        k=cnt=0;
        for(i=0;2*i<str1.size();++i){
            while(k>0&&(str2[2*k]!=str1[2*i]||str2[2*k+1]!=str1[2*i+1])){
                k=pi[k-1];
            }if(str2[2*k]==str1[2*i]&&str2[2*k+1]==str1[2*i+1]){
                ++k;
            }
            if(k==m){
                ++cnt;
                k=pi[k-1];
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
void KMP()
{
    int i,k=0;
    for(i=1;i*2<str2.size();++i){
        while(k>0&&(str2[2*k]!=str2[2*i]||str2[2*k+1]!=str2[2*i+1])){
            k=pi[k-1];
        }if(str2[2*k]==str2[2*i]&&str2[2*k+1]==str2[2*i+1]){
            ++k;
        }
        pi[i]=k;
    }
    return;
}

G

按理说G不水,但是数据水,所以我A了

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int mp[1<<30];
int main()
{
    ios::sync_with_stdio(false);
    int n,m,temp;
    while(cin>>n>>m){
        mp.clear();
        for(int i=0;i<m;++i){
            cin>>temp;
            mp[temp]++;
        }
        for(int i=0;i<m;++i){
            cin>>temp;
        }
        auto a=mp.begin(),b=mp.end();
        for(;a!=b;++a){
            if(a->second==1){
                cout<<a->first<<' ';
                break;
            }
        }
        for(++a;a!=b;++a){
            if(a->second==1){
                cout<<a->first<<endl;
                break;
            }
        }
    }
    return 0;
}

顺便欢迎点这里膜钱涛大佬(看正解)

H

直接打表然后暴力就好了

打表:

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    for(int i=32;i<100;++i){
        cout<<'"'<<i*i<<'"'<<',';
    }
    return 0;
}

本体:

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
string square[68]={"1024","1089","1156","1225","1296","1369","1444","1521","1600","1681","1764","1849","1936","2025","2116","2209","2304","2401","2500","2601","2704","2809","2916","3025","3136","3249","3364","3481","3600","3721","3844","3969","4096","4225","4356","4489","4624","4761","4900","5041","5184","5329","5476","5625","5776","5929","6084","6241","6400","6561","6724","6889","7056","7225","7396","7569","7744","7921","8100","8281","8464","8649","8836","9025","9216","9409","9604","9801"};
bool isok(string &a,string &b);
int main()
{
    ios::sync_with_stdio(false);
    int kase=0,cnt,n;
    string num;
    cin>>n;
    while(kase<n){
        cin>>num;
        cnt=0;
        for(int i=0;i<68;++i){
            if(isok(num,square[i]))++cnt;
        }
        cout<<"Case "<<++kase<<": "<<cnt<<endl;
    }
    return 0;
}
bool isok(string &a,string &b)
{
    int cnt=0;
    for(int i=0;i<4;++i){ 
        if(a[i]!=b[i]){
            ++cnt;
        }
    }
    if(cnt==1){
        return true;
    }
    return false;
}

K

看数组与自身反过来以后的LCS长度,答案就是单独的长度-LCS长度

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int arr[1010],rev[1010];
int dp[1010][1010];
int main()
{
    ios::sync_with_stdio(false);
    int t,n;
    cin>>t;
    while(t--){
        mem(dp,0);
        cin>>n;
        for(int i=1;i<=n;++i){
            cin>>arr[i];
            rev[n+1-i]=arr[i];
        }
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                if(arr[i]==rev[j]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        cout<<n-dp[n][n]<<endl;
    }
    return 0;
}

M

就一个模拟,原题在UVaLive,数据换了害我WA了……

#include <iostream>
#define MAXN 1010
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
LL arr[5];
int main()
{
//  fread;
    LL ans;
    while(cin>>arr[0]>>arr[1]>>arr[2]>>arr[3]){
        ans=-1;
        if(arr[0]==-1&&arr[1]==-1&&arr[2]==-1&&arr[3]==-1){
            break;
        }
        if(arr[0]==-1){
            if(arr[2]-arr[1]==arr[3]-arr[2]){
                ans=arr[1]-arr[2]+arr[1];
            }else if(arr[3]*arr[1]==arr[2]*arr[2]){
                ans=arr[1]*arr[1]/arr[2];
                if(ans*arr[2]!=arr[1]*arr[1]){
                    ans=-1;
                }
            }
        }else if(arr[1]==-1){
            if((arr[3]-arr[2])*2==arr[2]-arr[0]){
                ans=arr[2]-arr[3]+arr[2];
            }else if(arr[2]%arr[0]==0&&arr[3]%arr[2]==0&&(arr[3]/arr[2])*(arr[3]/arr[2])==arr[2]/arr[0]){
                ans=arr[2]*arr[2]/arr[3];
                if(arr[2]*arr[2]!=ans*arr[3]){
                    ans=-1;
                }
            }
        }else if(arr[2]==-1){
            if(2*(arr[1]-arr[0])==arr[3]-arr[1]){
                ans=arr[3]-arr[1]+arr[0];
            }else if(arr[1]%arr[0]==0&&arr[3]%arr[1]==0&&(arr[1]/arr[0])*(arr[1]/arr[0])==arr[3]/arr[1]){
                ans=arr[1]*arr[1]/arr[0];
                if(ans*ans!=arr[1]*arr[3]){
                    ans=-1;
                }
            }
        }else if(arr[3]==-1){
            if(arr[2]-arr[1]==arr[1]-arr[0]){
                ans=arr[2]+arr[2]-arr[1];
            }else if(arr[2]*arr[0]==arr[1]*arr[1]){
                ans=arr[2]*arr[2]/arr[1];
                if(ans*arr[1]!=arr[2]*arr[2]){
                    ans=-1;
                }
            }
        }
        if(ans<=0||ans>10000){
            ans=-1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

N

脑内画个图就出来通式了

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    LL a,b;
    while(cin>>a>>b){
        if(b>a){
            cout<<-1<<endl;
        }else{
            cout<<a+b<<endl;
        }
    }
    return 0;
}

O

都懒得解释了,这个题就是给你锻炼英语的

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
#define N 10100
#define INF 0x3f3f3f3f
#define eps 1e-9
using namespace std;
int arr[55];
int main()
{
    ios::sync_with_stdio(false);
    int n,cnt,t;
    while(cin>>n>>t){
        cnt=0;
        for(int i=0;i<n;++i){
            cin>>arr[i];
        }
        for(cnt=0;cnt<n;++cnt){
            if(t>=arr[cnt]){
                t-=arr[cnt];
            }else{
                break;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值