选择题+三道编程题,整体难度不高,8000hc,东子也可以冲了第一题思路:上界为n/2,然后暴力就好了#include <iostream>#include <cstring>#include <string>#include <cmath>#include <algorithm>#define ll long longusing namespace std;string solve(string str,int num){    if(num==0)return str;    string str1=str.substr(0,num);    string str2=str.substr(num,str.length()-num);    string str3=str2+str1;    return str3;}int judge(string str){    int len=str.length();    int num=0;    for(int i=0;i<len;i++){        if(str[i]!=str[len-i-1]){            num++;        }    }    return num/2;}int main(){    string str;    int n;    cin>>n;    cin>>str;    int len=n/2;    int ans=n/2;    for(int i=0;i<=len;i++){        string str_temp=solve(str,i);        int num=judge(str_temp);        ans=min(ans,num+i);        // cout<<str_temp<<endl;    }    cout<<ans<<endl;}第二题思路:滚动数组的思想更新状态即可,卡点为当n为1,但输入大于9时,输出全为0#include <iostream>#include <cstring>#include <string>#include <queue>#include <cmath>#include <algorithm>#include <stack>#define ll long longusing namespace std;const ll mod = 1e9+7;ll dp[10];ll last[10];stack<int>st;int main(){    memset(dp,0,sizeof(dp));    memset(last,0,sizeof(last));    int n;cin>>n;    ll tar;    for(int i=1;i<=n;i++){        ll w;cin>>w;        if(n==1)tar=w;        w=w%10;        st.push(w);    }    if(n==1){        int val=tar;        for(int i=0;i<10;i++){            if(i==val){                cout<<1<<' ';            }else{                cout<<0<<' ';            }        }        cout<<endl;    }    else{        int u=st.top();st.pop();        int v=st.top();st.pop();        int x=(u*v)%10;        int y=(u+v)%10;        dp[x]++;dp[y]++;        for(int i=0;i<10;i++){            last[i]=dp[i];        }        while(!st.empty()){            memset(dp,0,sizeof(dp));            int w=st.top();st.pop();            for(int i=0;i<10;i++){                if(last[i]!=0){                    int xx=(i+w)%10;                    int yy=(i*w)%10;                    dp[xx]=(dp[xx]+last[i])%mod;                    dp[yy]=(dp[yy]+last[i])%mod;                }            }            for(int i=0;i<10;i++){                last[i]=dp[i];            }        }        for(int i=0;i<10;i++){            cout<<last[i]<<' ';        }cout<<endl;    }    }第三题思路:分开判断摆正的正方形和斜的正方形即可#include <iostream>#include <cmath>#include <cstring>#include <string>#include <algorithm>#define ll long longusing namespace std;const int N = 55;int n,m;string mapInfo[N];ll allsum;bool islegal(int x,int y){    if(x<0||x>n||y<0||y>m||mapInfo[x][y]!='X')return false;    else return true;}void judge(int x,int y){    int xx,yy;    xx=x;    yy=y;    for(int i=1;i<=max(m,n);i++){        xx=x+i;        yy=y+i;        if(islegal(xx,yy)==false)continue;        xx=x;        yy=y+i;        if(islegal(xx,yy)==false)continue;        xx=x+i;        yy=y;        if(islegal(xx,yy)==false)continue;        allsum++;    }    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            xx=x;yy=y;            if(i==0&&j==0)continue;            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;            xx=xx+i;            yy=yy+j;            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;            if(islegal(xx,yy)==false)continue;            xx=xx+j;            yy=yy-i;            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;            if(islegal(xx,yy)==false)continue;            xx=xx-i;            yy=yy-j;            // if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;            // cout<<"==========="<<endl;            if(islegal(xx,yy)==false)continue;            xx=xx-j;            yy=yy+i;            if(islegal(xx,yy)==false)continue;            allsum++;            // cout<<x<<' '<<y<<' '<<i<<' '<<j<<endl;        }    }}int main(){    allsum=0;    cin>>n>>m;    for(int i=0;i<n;i++)cin>>mapInfo[i];    for(int i=0;i<n;i++){        for(int j=0;j<m;j++){            if(mapInfo[i][j]=='X'){                judge(i,j);            }        }    }    // ll ans=allsum/4;    cout<<allsum<<endl;}