目录
记录第一次比赛的题解
这次比赛让自己认识到了差距,一味的刷网课不太行,以后也要多打比赛,多锻炼锻炼思维
C题 NEUQ
原题传送门
这是一道暴力就能过的题,自己想的方法会段错误(以后记得考虑小数组会不会遇到数组越界访问的情况)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int main()
{
int n = 0;
char s[N] = {
0};
int res = 0;
char z[4] = {
'N', 'E', 'U', 'Q'};
int e = 0;
int t = 0;
cin>>n;
cin>>s;
for(int i = 0; i < n; i ++ ){
if(s[i] != 'N'){
res ++ ;
}
else{
t = 1;
for(int j = 1; j < 4; ){
if(s[i + t] != z[j]){
res ++ ;
}
else{
j ++ ;
}
t ++ ;
if(i + t == n && j < 3){
e = j;
break;
}
}
i = i + t - 1;
}
}
cout<<res + e<<endl;
return 0;
}
F题 第二大数
原题传送门
这也是一道暴力可以过的题,自己想的哪个思路在内部if.else过多会超时
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
typedef long long ll;
int n;
int a[N];
ll ans;
int main()
{
cin>>n;
for(int i = 1; i <= n; i ++ ) cin>>a[i];
for(int i = 1; i <= n; i ++ ){
int mx = max(a[i], a[i + 1]);
int x = min(a[i], a[i + 1]);
ans += x;
for(int j = i + 2; j <= n; j ++ ){
if(a[j] < x){
}
else if(a[j] > mx){
x = mx;
mx = a[j];
}
else{
x = a[j];
}
ans += x;
}
}
cout<<ans<<endl;
return 0;
}
E题 nn与游戏
原题传送门
solution:考察广度优先搜索算法,题意给出了一个大小为 且有障碍的矩阵,然后给出了m对起点
与终点,利用队列这种数据结构对每一个起点进行广度优先搜索即可得到起点到终点的最短距离,算法
流程如下:
①将起点加入队列。
②弹出队首元素u。
③将u上下左右四个方向且满足条件(不是障碍,不是其他的起点或终点,之前没有访问过)的点加入队
列,并更新距离。
④如果队列为空则退出,否则返回②
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, t;
int Map[N][N];//记录障碍
int w[N][N];//记录步数
bool z[N][N];//记录这个格子是否已经被走过
int a[15], b[15];//记录己方单位
int c[15], d[15];//记录敌方单位
int dx[4] = {
1, 0, -1, 0};
int dy[4] = {
0, 1, 0, -1};
int main()
{
cin>>n>>m;
for(int i = 1; i <= m; i ++ ){
int a, b;
cin>>a>>b;
Map[a][b] = -1;
}
cin>>t;
for(int i = 1; i <= t; i ++ ){
cin>>a[i]>>b[i]>>c[i]>>d[i];
Map[a[i]][b[i]] = -1;
Map[c[i]][d[i]] = -1;
}
for(int i = 1; i <= t; i ++ ){
/*初始化地图,清理以前留下的*/
for(int j = 0; j < n; j ++ ){
for(int k = 0; k < n; k ++ ){
w[j][k] = 0;//清理步数
z[j][k] = 0;//清理脚印
}
}
queue<pair<int, int>>Q;
Q.push({
a[i], b[i]});
int q = -1;//记录是否已经走完
while(Q.size()){
auto [x, y] = Q.