2024暑假集训第三次考试

3004. Sleepy Cow Sorting

思路分析

这道题是一道思维题。

这个就要结合之前学习过的算法,看这个题目的排序方式,我们就理所当然的想到了插入排序,也是这道题的正解。只需要看看前面有几个数是无序的就是需要排的次数。转换一下,也就是从后向前遍历,看看从第几个位置开始无序输出位置即可。(代码十分简单,主要是思路,这也是思维题的一大特征)

代码

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 1e5;
int a[N];

int main(){
	int n; cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	for(int i = n-1; i >= 1; i--){
		if(a[i]>a[i+1]){
			cout << i << endl;
			return 0;
		}
	}
	cout << 0 << endl;
	return 0;
} 

3000. Grass Planting

思路分析

图论题。

如果你一眼看上去可能会想到最短路径,拓扑排序等等图论的经典算法...但是其实这都不对,这就是一道图论的思维推理题。实现方法就是,统计出度数最大的顶点+1,就是正确答案。不管图什么样但是通过各种方式我们都可以抽象成下面这张图。然后根据题意推之就好了

代码

cpp 复制代码
#include<iostream>
using namespace std;
int n;
int a[200000];
int main(){
	cin>>n;
	int x,y;
	while(cin>>x>>y){
		a[y]++;
		a[x]++;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(a[i]>ans){
			ans=a[i];
		}
	}
	ans+=1;
	cout<<ans;
}
//度数最大的点的度数+1 

3001. Icy Perimeter

思路分析

bfs洪水填充-连通块的模版代码。

面积就是连通块的#号个数,而周长就是判断每个连通块里的#号所在的坐标(x,y)推之的

(x+1,y)(x-1,y) (x,y+1) (x,y-1)四个方向是否为"."号是的话周长+1,按照题意保留合法且最大的周长和面积即可。

代码

cpp 复制代码
#include<iostream>
#include<queue>
using namespace std;

typedef pair<int,int> PII;
const int N = 1e3+10;
char g[N][N],mg[N][N];
bool s[N][N];
int ss = -1e9,c = -1e9;
int n;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};

void bfs(int x,int y){
	int ms = 1,mc = 0;
	for(int i = 0; i < 4; i++){
		if(mg[x+dx[i]][y+dy[i]] == '.') mc++;
	}
	s[x][y] = 1;
	g[x][y] = '.';
	queue<PII> q;
	q.push({x,y});
	while(!q.empty()){
		auto h = q.front();
		q.pop();
		for(int i = 0; i < 4; i++){
			int sx = h.first+dx[i];
			int sy = h.second+dy[i];
			if(sx >= 0 && sy >= 0 && sx <= n && sy <= n && g[sx][sy] == '#' && !s[sx][sy]){
				ms++;
				for(int k = 0; k < 4; k++){
					if(mg[sx+dx[k]][sy+dy[k]] == '.') mc++;
				}
				q.push({sx,sy});
				g[sx][sy] = '.';
				s[sx][sy] = 1;
			} 
		}
	}
	if(ss == ms){
		c = min(c,mc);
	}
	if(ss < ms){
		ss = ms;
		c = mc;
	}
}

int main(){
	cin >> n;
	for(int i = 0; i <= n+1; i++){
		for(int j = 0; j <= n+1; j++){
			if(i ==0 || j == 0 || i == n+1 || j == n+1){
				g[i][j] = '.';
				mg[i][j] = g[i][j];
				continue;
			}
			cin >> g[i][j];
			mg[i][j] = g[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(g[i][j] == '#'){
				bfs(i,j);
			}
		}
	}
	cout << ss << " " << c << endl;
	return 0;
}

4000. 核电站

思路分析

DP题。

虽然题目最短可是却是难度最高的一道题,本蒟蒻就浅浅发表一下自己的看法,可能不是很清楚,可以去找神犇的题解。

这道题就要分两种抉择,一种是选,一种是不选,状态(i,j)在第i个位置从后往前已经放了j个核物质,判断如果>=m了的话就dp[i][j]+=dp[i-1][j-1].....

神犇题解链接:核电站问题(简单DP)_一个核电站有 n 个放核物质的坑,坑排列在一条直线上。如果连续 m 个坑中放入核物-CSDN博客

核电站_一个核电站有 n 个放核物质的坑,坑排列在一条直线上。如果连续 m 个坑中放入核物-CSDN博客

https://www.cnblogs.com/lzhxue/p/12689526.html

总结

这次考试的题目第一道题比较亏,所以应该加强对算法基础原理的理解,而不是一味的背板子,虽然有些算法的原理晦涩难懂(图论的最短路径),以及第四题的DP题,是算法竞赛的一大难点。要勤加练习!!

拼搏无边界,勇者无惧,以梦为马,不负韶华。

相关推荐
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
小鱼仙官5 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc
神仙别闹6 小时前
基本MFC类框架的俄罗斯方块游戏
c++·游戏·mfc
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨6 小时前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
兵哥工控6 小时前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc
Fuxiao___6 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我6 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法