2022-07-23 字节七月模拟笔试 71 分

图片说明

  1. 20’ 19:17 100%
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int main(){
    int m,n,p=0,t=0;
    int d,j;
    vector<vector<int>> b;
    cin>>m>>n;
    for(int i=0;i<n;i++){
        cin>>d>>j;
        b.push_back({d,j});
    }
    d=0;
    while(d<m){
        while(t<n&&b[d][1]<=b[t][1])
            t++;
//         cout<<"t= "<<t<<", d= "<<d<<"\n";
        if(t==n){
            p+=(m-d)*b[d][1];
            break;
        }
        p+=(b[t][0]-b[d][0])*b[d][1];
//         cout<<"p= "<<p<<"\n";
        d=b[t][0];

    }
    cout<<p;
    return 0;
}
  1. 25’ 19:36 80%
// 本题为考试多行输入输出规范示例,无需提交,不计分。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int d[4][2]={{-2,-2},{-2,2},{2,-2},{2,2}};
int yan[4][2]={{-1,-1},{-1,1},{1,-1},{1,1}};

int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> q(n+1,vector<int>(m+1,0));
    int k;cin>>k;
    for(int i=0,a,b;i<k;i++){
        cin>>a>>b;
        q[a][b]=1;
    }
    int x0,y0,xt,yt;
    cin>>x0>>y0>>xt>>yt;
    queue<vector<int>> qu;
    qu.push({x0,y0});
    int bu=0;
    while(!qu.empty()){
        queue<vector<int>> back;
        bu++;
        while(!qu.empty()){
            vector<int> p=qu.front();
            qu.pop();
            for(int i=0;i<4;i++){
                int nx=p[0]+yan[i][0],ny=p[1]+yan[i][1];
                if(nx>0&&nx<=n&&ny>0&&ny<=m&&q[nx][ny]!=1){
                    nx=p[0]+d[i][0],ny=p[1]+d[i][1];
                    if(nx>0&&nx<=n&&ny>0&&ny<=m&&q[nx][ny]==0){
                        if(nx==xt&&ny==yt){
                            cout<< bu;
                            return 0;
                        }
                        q[nx][ny]=2;
                        back.push({nx,ny});
                    }
                }
            }
        }
        qu=back;
    }
    cout<<-1;
    return 0;
}
  1. 25‘ 19:48 100%
// 本题为考试多行输入输出规范示例,无需提交,不计分。
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;
#define C cin>>
#define p pair<int,int>

int main(){
    int n;C n;
    vector<p> x(n);
    for(int i=0;i<n;++i){
        C x[i].first;
        C x[i].second;
    }
    vector<int> dp(n,0);
    dp[n-1]=x[n-1].first;
    for(int i=n-2;i>=0;i--){
        int d=x[i].second, t=0;
        if(i+d+1<n){
            t=dp[i+d+1];
        }
        dp[i]=max(dp[i+1],x[i].first+t);
    }
    cout<<dp[0];
    return 0;
}
  1. 30‘ 20:53 20%
// 本题为考试多行输入输出规范示例,无需提交,不计分。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define C cin>>
#define ull unsigned long long
#define _f(i,a,b) for(int i=a;i<b;i++)

int m=0, n=0, t;

inline int dis(int x, int y){
    return min(abs(y-x), m-abs(x-y));
}

// int main(){
//     C n;
//     C m;
//     vector<int> p(m);
//     _f(i,0,n){
//         C t;
//         p[t-1]=1;
//     }
//     vector<int> pre(m+1,0);
//     _f(i,1,m+1)
//         pre[i]=pre[i-1]+p[i-1];

//     vector<ull> posCnt(m+1,0); // 前 i 个人的位置的前缀和
//     _f(i,1,m+1)
//         posCnt[i] = p[i-1]==1 ? posCnt[i-1]+i-1 : posCnt[i-1];

//     ull minD=0x0fffffffffff;
//     _f(from,0,m){
//         int to = (from+n-1)%m;
//         int c = to>=from? pre[to+1]-pre[from] : n - pre[from] + pre[to+1]; // 人数
//         int thisAns=0;
//         if(from<=to){
//             ull leftC=0,rightC=0,midC=0;
// //             left = pre[from]*(from-1) - posCnt[from];
// //             right = posCnt[m] - posCnt[m+1] - (n-pre[to+1])*(to+1);
//             int mid=(to+(m-n)/2)%m; // 不一定都是从中间划开...
//             if(mid>to){
//                 leftC = posCnt[mid+1]-posCnt[to+1]-(ull)(pre[mid+1]-pre[to+1])*(to+1);
//                 rightC = ...
//             }else{

//             }
//         }else{

//         }
//     }
//     cout<<1;
//     return 0;
// }

int main(){
    C n;
    C m;
    vector<int> p(m);
    _f(i,0,n){
        C t;
        p[t-1]=1;
    }
    vector<int> pre(m+1,0);
    _f(i,1,m+1)
        pre[i]=pre[i-1]+p[i-1];

    vector<ull> posCnt(m+1,0); // 前 i 个人的位置的前缀和
    _f(i,1,m+1)
        posCnt[i] = p[i-1]==1 ? posCnt[i-1]+i-1 : posCnt[i-1];

    ull minD=0;
//     deque<int> qian,hou;
//     for(int i=n;i<m;i++)
//         if(p[i]==1)
//             hou.push_back(i);
    _f(from,0,m){
        ull minD_=0;
        int to = (from+n-1)%m;
        int c = to>=from? pre[to+1]-pre[from] : n - pre[from] + pre[to+1]; // 人数
        deque<int> q;
        for(int i=0;i<n;i++){
            t = (from+i)%m;
            if(p[t]==0)
                q.push_back(t);
        }
        deque<int> wai;
        if(from<to){
            for(int i=from-1;i>=0;i--)
                if(p[i]==1)
                    wai.push_back(i);
            for(int i=m-1;i>to;i--)
                if(p[i]==1)
                    wai.push_back(i);
            while(!wai.empty()){
                int xh1=q.front(),xh2=q.back();
                int yh1=wai.front(),yh2=wai.back();
                int d11=dis(xh1,yh1),d12=dis(xh1,yh2),d21=dis(xh2,yh1),d22=dis(xh2,yh2);
                int mind=min(min(d11,d12),min(d21,d22));
                minD_+=mind;
                if(mind==d11){
                    q.pop_front();
                    wai.pop_front();
                }else if(mind==d12){
                    q.pop_front();
                    wai.pop_back();
                }else if(mind==d21){
                    q.pop_back();
                    wai.pop_front();
                }else{
                    q.pop_back();
                    wai.pop_back();
                }
            }
        }
        else{
            for(int i=to+1;i<from;i++)
                if(p[i]==1)
                    wai.push_back(i);
            while(!wai.empty()){
                int xh1=q.front(),xh2=q.back();
                int yh1=wai.front(),yh2=wai.back();
                int d11=dis(xh1,yh1),d12=dis(xh1,yh2),d21=dis(xh2,yh1),d22=dis(xh2,yh2);
                int mind=min(min(d11,d12),min(d21,d22));
                minD_+=mind;
                if(mind==d11){
                    q.pop_front();
                    wai.pop_front();
                }else if(mind==d12){
                    q.pop_front();
                    wai.pop_back();
                }else if(mind==d21){
                    q.pop_back();
                    wai.pop_front();
                }else{
                    q.pop_back();
                    wai.pop_back();
                }
            }
        }
        minD=min(minD,minD_);
    }
    cout<<minD;
    return 0;
}
#字节笔试##互联网校招全国统一模拟笔试##秋招#
全部评论
第二题可能是内存的原因?
点赞 回复 分享
发布于 2022-07-23 21:08

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务