3-26网易雷火部分题解

咳咳 打完马上同步更哈

 二三题有点麻烦
第一题求方案数加个和 100 
第二题扑克组合最大值 100
第三题字符串分行 100
第四题水漫两点通路 100

第一题直接求个和就行
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxx = 1e2 +7;
#define rep(i, j ,n) for(int i = j; i <= n; i++)
int a[maxx][maxx];
int main() {
    int x, y;
    int ans = 0;
    cin >> n >> m;
    cin >> x >> y;
    rep(i, 1, n)
        rep(j, 1, m) {
        cin >> a[i][j];
        if(i != x || j!= y){
            ans += a[i][j];
        }
    }
    cout << ans + 1 << endl;
    return 0;
}



第二题模拟
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxx = 1e2 +7;
#define rep(i, j ,n) for(int i = j; i <= n; i++)
int a[maxx];
char b[maxx];
int main() {
    int x, y;
    int ans = 0;
    int t;
    cin >> t;
    map<char, int>mp;
    while(t--){
         cin >> n;
        mp.clear();
        for(int i = 1; i <= n; i++){
            cin >> a[i];
        }
        for(int i = 1; i <= n; i++){
            cin >> b[i];
        }
        
        int ans = 1;
        for(int i = n + 1; i <= 5 ; i++){
            a[i] = -i;
        }
        int flag1 = 1, flag2 = 1;
        for(int i = 2; i <= n; i++){
            if(a[i] != a[1]) flag1 = 0;
        }
        if(flag1 == 1 && n == 5)
            ans = max(ans, 15000);
        
        for(int i = 2;i <= n; i++){
            if(b[i] != b[1]) flag2 = 0;
        }
        sort(a + 1, a + 1 + n);
        if(n == 5 && flag2 == 1 && a[1] + 1== a[2] && a[2] + 1 == a[3] && a[3] + 1 == a[4] && a[4] + 1 == a[5])
            ans = max(ans, 8000);
        
        if(flag2 == 1 && n == 5)
            ans = max(ans, 300);
        
        if( n >= 4 && (a[1] == a[4] || a[2] == a[5]) )
            ans = max(ans, 150);
        
        if(n == 5 && ( a[1] == a[2] && a[3] == a[5]  || a[1] == a[3] && a[4] == a[5]) )
            ans = max(ans, 40);
        if(n == 5 && a[1] == a[2] - 1 && a[2] == a[3] - 1 && a[3] == a[4] - 1 && a[4] == a[5] - 1)
            ans = max(ans, 20);
        
        if(n >= 3 && ( a[1] == a[3] || a[2] == a[4] || a[3] == a[5] ) ) ans = max(ans, 6);
        int num = 0;
        for(int i = 1; i <= n; i++){
            if(a[i] == a[i + 1]){
                i++;
                num++;
            }
        }
        if(num == 2){
            ans = max(ans, 4);
        }
        if(num == 1){
            ans = max(ans, 2);
        }
        
        printf("%d\n",ans);
    }

    return 0;
}




第三题模拟
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
// 这个方法一直过40有点恶心
后面直接重写了个判标点的过了,忘了存代码了,大概思路存一下上一行的选择,挨着判断一下

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxx = 1e4 +7;
#define rep(i, j ,n) for(int i = j; i <= n; i++)
int len[maxx];

string s;
string a[maxx];
int main() {
    int x, y;
    int ans = 0;
    cin >> n >> m;
    getchar();
    getline(cin, s);
    
    int len = 0;
    int cnt = 0;
    string p = "";
    for(int j = 0; j < s.size(); j++){
        if(s[j] != ' ' ){
            p.push_back(s[j]);
        }
        else {
            a[++cnt] = p;
            p = "";
        }
    }
    if(p != "") a[++cnt] = p;
    
    //cout << s << endl;
    
    for(int i = 1; i <= cnt; i++){
        int ans = 0;
        int j = i;
        for(j = i; j <= cnt; j++){
            ans += a[j].size();
            if(ans > n + m) break;
            ans++;
            //if(ans >= n + m) break;
        }
        j--;
        if(j <= cnt + 1){
            len++;
        }
        i = j;
    }
    printf("%d\n",len);
    for(int i = 1; i <= cnt; i++){
        int ans = 0;
        int j = i;
        for(j = i; j <= cnt; j++){
            ans += a[j].size();
            if(ans > n + m ) break;
            ans++;
            //if(ans >= n + m) break;
        }
        j--;
        if(j <= cnt + 1){
            for(int k = i; k <= j; k++){
                cout << a[k];
                if(k == j) printf("\n");
                else printf(" ");
            }
            
        }
        i = j;
    }
    
    return 0;
}




第四题直接二分就行
 // 本题为考试单行多行输入输出规范示例,无需提交,不计分。
#include <bits/stdc++.h>
using namespace std;
const int maxx = 708;
#define rep(i, j ,n) for(int i = j; i <= n; i++)
int n, m;
int a[maxx][maxx];
int startX, startY, endX, endY;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int vis[maxx][maxx];
int judge(int num){
    if(a[endX][endY] > num) return 0;
    memset(vis, 0, sizeof(vis));
    vis[startX][startY] = 1;
    queue< pair<int, int >> q;
    q.push({startX, startY});
    while(!q.empty()){
        int x = q.front().first, y = q.front().second;
        q.pop();
        for(int i = 0; i <= 3; i++){
            int px = x + dx[i];
            int py = y + dy[i];
            if(!vis[px][py] && a[px][py] <= num && px >= 1 && px <= n && py >= 1 && py <= m  ){
                if(px == endX && py == endY) return 1;
                q.push({px, py});
                vis[px][py] = 1;
            }
        }
    }
    return vis[endX][endY];
}
int main() {
    int x, y;
    cin >> n >> m;
    
    cin >> startX >> startY;
    cin >> endX >> endY;
    int maxl = 0;
    rep(i, 1, n)
        rep(j, 1, m) {
        cin >> a[i][j];
        maxl = max(maxl, a[i][j]);
    }
        
    int l = a[startX][startY], r = 1e9;
    int ans = maxl;
    while(l <= r){
        int mid = (l + r) >> 1;
        if(judge(mid)){
            ans = min (ans, mid);
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    cout << ans << endl;
    return 0;
}





#网易雷火笔试##网易雷火#
全部评论
我真服了,第一题我怎么看都是8,他写的9我想了半天没明白,然后照着8写了一下全a了。。。。。。
1 回复 分享
发布于 2022-03-26 15:54
同学你好,请勿***。
点赞 回复 分享
发布于 2022-03-26 14:38
已做完,注意第一题示例答案错了,正确答案是8
点赞 回复 分享
发布于 2022-03-26 15:39
后端两道都不会的路过
点赞 回复 分享
发布于 2022-03-26 15:51
我是真的不会字符串
点赞 回复 分享
发布于 2022-03-26 16:00
为什么12.就有题了?
点赞 回复 分享
发布于 2022-03-26 17:42

相关推荐

26java国军入坑:校奖能不写就不写
点赞 评论 收藏
分享
7 17 评论
分享
牛客网
牛客企业服务