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; }