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