京东8.12AK C++卷

选择题+三道编程题,整体难度不高,8000hc,东子也可以冲了

第一题思路:上界为n/2,然后暴力就好了

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#define ll long long
using 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 long
using 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 long
using 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;
}
全部评论
一看就是acm
2 回复 分享
发布于 2023-08-12 21:31 广东
Acm选手,太强了
1 回复 分享
发布于 2023-08-12 21:53 上海
同学,阿里控股集团JAVA开发岗投吗?我们和其他业务集团独立招聘,可以多次机会。需要的话,可以联系我。
点赞 回复 分享
发布于 2023-08-14 19:40 浙江

相关推荐

牛客154160166号:9月底还给我发短信,好奇怪,我24届的
点赞 评论 收藏
分享
14 33 评论
分享
牛客网
牛客企业服务