第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 补题题解

博主分享了在第九届‘图灵杯’NEUQ-ACM程序设计竞赛个人赛的题解,包括C、F、E、H、I、J、K、L和M题。题目涉及暴力解决、广度优先搜索、特征值计算、最大公约数等算法。博主反思了比赛中自己的不足,认识到刷网课与实战结合的重要性,决定增加比赛锻炼。
摘要由CSDN通过智能技术生成


记录第一次比赛的题解

这次比赛让自己认识到了差距,一味的刷网课不太行,以后也要多打比赛,多锻炼锻炼思维

比赛传送门


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.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值