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

查看30道真题和解析

