2024暑假集训第三次考试

3004. Sleepy Cow Sorting

思路分析

        这道题是一道思维题。

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

代码

#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,就是正确答案。不管图什么样但是通过各种方式我们都可以抽象成下面这张图。然后根据题意推之就好了

代码

#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,按照题意保留合法且最大的周长和面积即可。

代码

#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题,是算法竞赛的一大难点。要勤加练习!!

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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值