网易互娱服务端4a题解(cpp)

阿已经连续微众拼多多网易互娱快乐ak了 希望周一能拿到美团oc结束0offer悲剧
t4 简单分析可知是一个有向无环图 可以通过构建一个连接全部节点的虚节点进行队列优化的BFS

#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#define maxn 100
using namespace std;
vector<int>G[maxn];
void addedge(int l,int r){
    G[l].push_back(r);
}
int boxes[100][3];
int main(){
    int boxesRowLen;
    cin >> boxesRowLen;
    for(int i = 0; i < boxesRowLen; i++){
        cin >> boxes[i][0] >> boxes[i][1] >> boxes[i][2];
        addedge(0,i+1);
    }
    for(int i = 0; i < boxesRowLen; i++){
        for(int j = 0; j < boxesRowLen; j++){
            if(boxes[i][0] < boxes[j][0] && boxes[i][1] < boxes[j][1] && boxes[i][2] < boxes[j][2]) {
                addedge(i+1,j+1);
            }
         }
    }
    queue<int>que;
    bool inq[maxn];
    memset(inq,0,sizeof(inq));
    int dist[maxn];
    memset(dist, -1, sizeof(dist));
    dist[0] = 0;
    que.push(0);
    int ans = 0;
    while(!que.empty()) {
        int k = que.front();
        inq[k] = 0;
        que.pop();
        for(int i = 0; i < G[k].size(); i++){
            int v = G[k][i];
            if(dist[v] == -1 || dist[v] < dist[k] + 1){
                dist[v] = dist[k]+1;
                ans = max(ans,dist[v]);
                if(!inq[v]){
                    inq[v] = 1;
                    que.push(v);
                }
            }
        }
    }
    cout << ans;
}

t3 恶心lenDFS 就正常暴搜 我在最后10min才发现新选择的节点还要对其依赖进行放置,并确保没和不喜欢的放在一起,改了7min差3min就***叹人生的时候莫名其妙过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#define maxn 9
#define maxm 9
#define maxx 52
using namespace std;
bool hate[maxx][maxx];
bool lov[maxx][maxx];
char nam[maxx];
int pick[maxm][maxn];
bool vis[maxx];
int n,m;
inline int toid (int i, int j){
    return i*m + j;
}
bool flg = 0;
void DFS(int tm,int tn){
    if(flg)
    return;
    if(tn == n){
        flg = 1;
        //cout << "adsdasdasdas";
        return;
    }
    if(pick[tm][tn] == -1){
        for(int i = 0; i < m; i++){
            int t = toid(tn,i);
            if(!vis[t]) {
                bool flgg = 1;
                for(int j = 0; j < tn; j++){
                    int c = pick[tm][j];
                    if(hate[c][t]){
                        flgg = 0;
                        break;
                    }
                }
                queue<int>que;
                que.push(t);
                queue<int>quee;
                while(!que.empty()){
                    int k = que.front();
                    que.pop();
                    for(int j = 0; j < n; j++){
                        if(pick[tm][j] == -1)
                        continue;
                    int c = pick[tm][j];
                    if(hate[c][k]){
                        flgg = 0;
                        break;
                    }
                }
                for(int j = 0; j < maxx; j++){
                    if (j == t)
                    continue;
                    if(lov[t][j]){
                        if(!vis[j] && pick[tm][j/m] == -1){
                            que.push(j);
                            quee.push(j);
                            pick[tm][j/m] = j;

                        } else if(pick[tm][j/m] == j){
                            continue;
                        }else{
                            flgg = 0;
                        }
                    }
                }

                }

                if(flgg){
                    vis[t] = 1;
                    pick[tm][tn] = t;
                    if(tm == m-1)
                    DFS(0,tn+1);
                    else
                    DFS(tm+1,tn);
                    if(flg)
                    return;
                    vis[t] = 0;
                    pick[tm][tn] = -1;
                }
                while(!quee.empty()){
                    int k = quee.front();
                    quee.pop();
                    pick[tm][k/m] = -1;
                    vis[k] = 0;
                }
            }
        }
    }else{
        if(tm == m-1)
            DFS(0,tn+1);
        else
            DFS(tm+1,tn);
    }
    return;
}
int main(){

    cin >> n >> m;
    memset(pick,-1,sizeof(pick));
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j++) {
            int c = toid(i,j);
            cin >> nam[c];
        }
    }
    int ai,aj,bi,bj;
    char c;
    while(cin >> ai >> aj >> c >> bi >> bj) {
        if(ai == 0)
        break;
        if(c == 'N'){
            int ta = toid(ai-1,aj-1), tb = toid(bi-1,bj-1);
            //cout << "hate" << nam[ta] << " " << nam[tb] << endl;
            hate[ta][tb] = 1;
            hate[tb][ta] = 1;
        }
        if(c == 'Y'){
            int ta = toid(ai-1,aj-1), tb = toid(bi-1,bj-1);
            //cout << "love" << nam[ta] << " " << nam[tb] << endl;
            lov[ta][tb] = 1;
            lov[tb][ta] = 1;
        }
    }
    queue<int>que;
    for(int i = 0; i < m; i++){
        que.push(i);
        vis[i] = 1;
        pick[i][0] = i;
        while(!que.empty()){
            int k = que.front();
            que.pop();
            for(int j = 0; j < m*n; j++){
                if(lov[k][j] && !vis[j]){
                    pick[i][j/m] = j;
                    vis[j] = 1;
                    que.push(j);
                }
            }
        }
    }
    /*for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j ++) {
            cout<<pick[i][j] << " ";
        }
        cout <<endl;
    }*/
    DFS(0,1);
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++) {
            cout<< nam[pick[i][j]];
        }
        cout <<endl;
    }
}

t2 把两个数组从小到大排序一下,对员工技能熟练度从小到大遍历 同时使用一个指针来找到可以被当前员工完成的全部任务的个数k,然后就1(k1-i1+1)(k2-i2+1)..... 就出来了
一开始完全没思路 后来看着看着数据觉得 333 321 = 6有点奥妙重重 然后就想出来了

#include <iostream>
#include <cstdio>
#include <algorithm>
#define maxn 100000
using namespace std;
int t[maxn],c[maxn];
int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> t[i];
    }
    for(int i = 0; i < n; i++){
        cin >> c[i];
    }
    long long m;
    cin >> m;
    int j = 0;
    long long ans = 1;
    sort(t,t+n);
    sort(c,c+n);
    for(int i = 0; i < n; i++){
        while(j < n && c[j] <= t[i])
        j++;
        if(c[j] > t[i] || j == n)
        j--;
        //cout  << j+1-i<<endl;
        ans*=(j+1-i);
        ans%=m;
    }
    cout << ans;
}

t1 简单字符串操作 写的时候因为今天一天就睡了4个小时 出现了无数的bug 希望能赶紧被给个offer 焦虑的天天睡不着可太难受了

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
    string num1,num2;
    cin >> num1 >> num2;
    //num1 = "";
    //num2 = "";
    int num1pos = num1.size();
    for(int i = 0; i < num1.size(); i++){
        if(num1[i] == '.') {
            num1pos = i;
            break;
        }
    }
    int num2pos = num2.size();
    for(int i = 0; i < num2.size(); i++){
        if(num2[i] == '.') {
            num2pos = i;
            break;
        }
    }
    string num1r = "";
    if(num1pos != num1.size())
    num1r = num1.substr(num1pos+1,num1.size() - num1pos);
    string num2r = "";
    if(num2pos != num2.size())
    num2r = num2.substr(num2pos+1,num2.size() - num2pos);
    string num1l = num1.substr(0,num1pos);
    string num2l = num2.substr(0,num2pos);
    //cout << num1l << endl << num1r << endl << num2l << endl << num2r<<endl;
    if(num1r.size() < num2r.size()){
        string k = num2r;
        num2r = num1r;
        num1r = k;
    }
    //cout << num1r << endl;
    int jin = 0;
    for(int i = num1r.size() - 1; i >= 0; i--){
        if( i < num2r.size() ){
            int k = num2r[i] + num1r[i] + jin;
            k -= 96;
            jin = k/9;
            k = k%9;
            num1r[i] = k+'0';
        }
    }
    if(num1l.size() < num2l.size()){
        string k = num1l;
        num1l = num2l;
        num2l = k;
    }
    for(int i = 0; i < num1l.size(); i++){
        if(i < num2l.size() || jin != 0){
            int k = num1l[num1l.size() - i -1] - 48 + jin;
            if(i < num2l.size())
            k += num2l[num2l.size() - i -1] - 48;
            jin = k/9;
            k = k%9;
            num1l[num1l.size() - i -1] = k+'0';
        }
    }
    string c = "";
    if(jin != 0)
    c += "1";
    c+=num1l;
    if(num1r.size()){
        c+=".";
        c+=num1r;
    }
    cout << c;
}
#网易笔试#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
5
3
分享

创作者周榜

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