首页 > 网易8.21通用技术A卷
头像
ffacs
编辑于 2021-08-21 16:57
+ 关注

网易8.21通用技术A卷

A

送分题

#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main (){
    vector<long long> V;
    long long n;
    while(cin>>n) {V.push_back(n);}
    n=V.back();V.pop_back();
    sort(V.begin(),V.end());
    long long res=0;
    for(int i=1;i<V.size();i++) {
        res+=upper_bound(V.begin(),V.begin()+i,n-V[i])-V.begin();
    }
    cout<<res<<endl;
}

B

就递归一下?

#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
char getKth(int n,int k,bool inv) {
    int mid=1<<(n-1);
    char res;
    if(k==mid) res='a'+n-1;
    else if(k<mid) res=getKth(n-1,k,0);
    else res=getKth(n-1,(1<<(n-1))-(k-mid),1);
    if(inv) {
        return 25-(res-'a')+'a';
    }
    return res;
}
char findKthBit(int n, int k) {
    return getKth(n,k,0);
}
int main (){
    // for(int i=1;i<10;i++) cout<<findKthBit(4,i);
}

C

拓扑排序,如果一个人比另外一个小就建边,复杂度O(n)

#include <iostream>
#include <queue>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
struct EDGE{
    int v,nex;
}edge[maxn];
int deg[maxn],head[maxn],ecnt,res[maxn];
inline void add_edge(int u,int v) {
    edge[++ecnt]={v,head[u]};head[u]=ecnt;
    deg[v]++;
}
int main (){
    vector<int> V;
    int n;
    while(cin>>n) V.push_back(n);
    n=V.size();
    for(int i=0;i<n;i++) {
        int l=(i+n-1)%n,r=(i+1)%n;
        if(V[i]<V[l]) add_edge(i+1,l+1);
        if(V[i]<V[r]) add_edge(i+1,r+1);
    }
    queue<int> Q;
    for(int i=1;i<=n;i++) {
        if(deg[i]==0) {
            Q.push(i),res[i]=1;
        }
    }
    int tot=0;
    while(!Q.empty()) {
        int u=Q.front();Q.pop();
        tot+=res[u];
        for(int i=head[u];i;i=edge[i].nex) {
            int v=edge[i].v;
            res[v]=res[u]+1;
            deg[v]--;
            if(deg[v]==0) Q.push(v);
        }
    }
    cout<<tot<<endl;
}

D

感觉正解其实是把花费为2的点拆成上下左右四个点,然后相邻的点连接他伸出来的点,这样进行bfs得到的就是最短路,复杂度O(n*m) 。但是我嫌麻烦,直接写的SPFA,跑得飞快。

#include <iostream>
#include <queue>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int minSailCost(vector<vector<int> >& input) {
    int n=input.si***put[0].size();
    const int INF=100000000;
    vector<vector<int>> dis(n,vector<int>(m,INF));
    vector<vector<int>> inq(n,vector<int>(m,0));
    int dx[]={0,1,0,-1};
    int dy[]={1,0,-1,0};
    queue<pair<int,int>> Q;
    Q.push({0,0});dis[0][0]=0;inq[0][0]=1;
    while(!Q.empty()) {
        auto u=Q.front();Q.pop();
        int y=u.first,x=u.second;
        inq[y][x]=0;
        for(int i=0;i<4;i++) {
            int ny=y+dy[i],nx=x+dx[i];
            if(ny<0||ny>=n||nx<0||nx>=m||input[ny][nx]==2) continue;
            if(dis[y][x]+2-input[ny][nx]<dis[ny][nx]) {
                dis[ny][nx]=dis[y][x]+2-input[ny][nx];
                if(!inq[ny][nx]) {
                    inq[ny][nx]=1;
                    Q.push({ny,nx});
                }
            }
        }
    }
    if(dis[n-1][m-1]==INF) return -1;
    return dis[n-1][m-1];
}
int main (){
    int n,m;cin>>n>>m;
    vector<vector<int>> V(n,vector<int>(m));
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>V[i][j];
    cout<<minSailCost(V);
}

全部评论

(1) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐