NOI2024 - 最终的答案

我的故事并不完美。但是至少它充满了英雄主义气质。

DAY -2

UNR考了rk 48。感觉没什么意思。

其余无甚可记的。

DAY -1/0

到达育才。发现和xukai分在了一个寝室。然后在qq上和他简单交流了一下。

但是我们话都很少。因此无甚可记。

然后找一堆人换了徽章。发现徽章订了15个太少了,一会儿就换完了,不然还能再换十几个。后面就变成找其他人白嫖了。

DAY 1

都退役了还有啥好些比赛经过的?

开场20min切了T1,然后发现T2是唐氏交互题,随便搜一搜就有了80。然后发现不会T3,就先拼了36分的暴力。

然后我TM降智了,居然T2没想到每一层只会分成大小为aaaa+1a+1a+1的块。其实是我写的搜索不够精细,最后只干到了85分。

赛后再写一写就过了T2的100分。T3的56分也很简单,但是没想到就是特殊性质A的拓展。

DAY 2

开考2h都只写了T1和T2的部分分。开考后1h去上了趟厕所,中途想的是T1的正解怎么这么TM难。

然后硬肝T2。因为SB错误T2调了整整1h才搞过去,剩下30min凭借肌肉记忆拼了T3的20分暴力。

终章

100+5+100+85+36+85+100+20=531。

考完估的队线是520左右。结果没想到过D2T2的人比想象中的多,结果队线TM越来越高,最后快接近540了。

diu大概也寄了。好可惜。

突然有一种英雄主义式的悲壮,是的,我们都希望有大团圆式的结局,但是有人即使拼尽了所有,却还是最终惜败,但是,我想,这次我做了自己眼中的英雄。

后话

至少在这一刻,我不后悔选择OI,OI让我结识了一批优秀的同学和老师。

我多么希望我就这样进入了集训队,然后一切圆满。但是现实往往残酷,不过好在我还有一群我爱的和爱我的同学和老师,为了他们我必须战斗下去。

whk你好。好久不见。

### 关于NOI 1.8题库中的C语言题目解答 #### 肿瘤面积计算 对于肿瘤面积的求解,涉及到连通块问题以及二维数组的应用。通过给定的一个字符矩阵表示图像,其中'@'代表癌细胞位置,其他符号代表正常组织部分。为了找到所有癌细胞组成的区域大小,可以采用深度优先搜索(DFS)算法来遍历相连的癌细胞群落并统计其数量。 ```c #include <stdio.h> #define MAXN 1005 char map[MAXN][MAXN]; int n, m; void dfs(int x, int y){ if(x<0 || x>=n || y<0 || y>=m || map[x][y]!='@') return; map[x][y] = '*'; //标记已访问 //八个方向扩散 dfs(x-1,y);dfs(x+1,y); dfs(x,y-1);dfs(x,y+1); dfs(x-1,y-1);dfs(x-1,y+1); dfs(x+1,y-1);dfs(x+1,y+1); } int main(){ while(scanf("%d%d",&n,&m)!=EOF && (n||m)){ for(int i=0;i<n;++i) scanf("%s",map[i]); int cnt = 0; for(int i=0;i<n;++i) for(int j=0;j<m;++j) if(map[i][j]=='@'){ ++cnt;dfs(i,j); } printf("%d\n",cnt); } } ``` 此程序实现了对输入数据中每一块独立存在的癌变区进行计数的功能[^1]。 #### 二维数组回形遍历实现 针对二维数组按照特定路径顺序读取元素的需求,在这里介绍一种基于模拟的方法——即让一个虚拟指针沿着指定路线移动直至覆盖全部格子。具体做法是从左上角出发沿顺时针螺旋线逐步向内收缩边界直到完成整个表格扫描工作。 ```c #include<stdio.h> const int maxn = 25; int a[maxn][maxn], b[maxn*maxn]; int main() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &a[i][j]); int top = 0, bottom = n - 1, left = 0, right = n - 1, index = 0; while (top <= bottom && left <= right) { for (int col = left; col <= right; ++col) b[index++] = a[top][col];++top; for (int row = top; row <= bottom; ++row) b[index++] = a[row][right];--right; if (top <= bottom) for (int col = right; col >= left; --col) b[index++] = a[bottom][col];--bottom; if (left <= right) for (int row = bottom; row >= top; --row) b[index++] = a[row][left];++left; } for (int i = 0; i < n * n; ++i) printf("%d%c", b[i], " \n"[i==n*n-1]); } ``` 上述代码片段展示了如何利用循环控制结构配合条件判断语句达成预期效果[^2]。 #### 矩阵归零消减序列和处理 当面对需要多次操作同一位置数值的情况时,可以通过预先记录下每次变化后的状态来进行最终结果输出。本案例中提到的操作是指不断选取当前剩余最大值所在行列并将这些行与列上的其它非目标单元置零的过程;值得注意的是,尽管经过多轮迭代更新,仍需保持原始状态下某些固定坐标处的数据不变以便后续查询使用。 ```c #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; PII pos[105]; bool vis[105][105]={false}; int mat[105][105],ans[105]; int main(){ memset(mat,-1,sizeof(mat)); int N,M,Q,x,y,val,maxx=-99999999,minn=99999999,kase=0; char op[5]; cin>>M>>Q; vector<pair<int,pair<int,int>>> vec; for(int i=1;i<=M;i++){ for(int j=1;j<=M;j++)cin>>mat[i][j]; } cout<<mat[2][2]<<endl; for(int qqqq=1;qqqq<Q;qqqq++){ cin>>(op+1)>>val; if(op[1]=='R') for(int i=1;i<=M;i++) if(!vis[val][i])vec.push_back({mat[val][i],{val,i}}); else for(int i=1;i<=M;i++) if(!vis[i][val])vec.push_back({mat[i][val],{i,val}}); sort(vec.begin(),vec.end()); reverse(vec.begin(),vec.end()); ans[++kase]=vec.front().first; maxx=max(maxx,vec.front().first); minn=min(minn,vec.front().first); vis[pos[kase].second.first][pos[kase].second.second]=true; vec.clear(); } for(int i=1;i<=kase;i++)cout<<ans[i]<<" "; puts(""); cout<<minn<<" "<<maxx<<"\n"; cout<<mat[2][2]<<endl; } ``` 这段源码体现了怎样巧妙运用辅助变量保存中间步骤的信息从而简化复杂逻辑运算的同时也满足了额外的要求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值