[暴力题解系列]2023年蓝桥杯-整数删除(30分)
这题暴力最多30分,但是30分也是分,做暴力的人不能贪心,拿到分就是赚了。
这题核心烦人点在于他数据分层断崖,就只有前3个点能做到稳过。用的思路就是链表,但不是用指针存的,而是用数组下标为标记存的,只是我觉得因为这样好写一些。链表方便修改左右连接位置,所以越到后面就越能省下查询的时间
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int n, k; struct dat{ int l, r; int num; bool valid; }a[500050]; void modify(int i) { a[a[i].l].num += a[i].num; if(a[i].r != -1) a[a[i].r].num += a[i].num; a[a[i].l].r = a[i].r; if(a[i].r !=-1) a[a[i].r].l = a[i].l; a[i].valid = false; } int findSmallest() { int p, minn = 1e9, minp; for(int i=1; i<=n; i++) if(a[i].valid) { p = i; break; } minp = p; while(1) { //printf("%d ", a[p].num); if(a[p].num < minn) { minp = p; minn = a[p].num; } if(a[p].r == -1) break; else p = a[p].r; } return minp; } void dbgShowChain() { int p; for(int i=1; i<=n; i++) if(a[i].valid) { p = i; break; } while(1) { printf("%d ", a[p].num); if(a[p].r == -1) break; else p = a[p].r; } printf("\n"); } int main() { scanf("%d%d", &n, &k); for(int i=1; i<=n; i++) { scanf("%d", &a[i].num); a[i].l = i-1, a[i].r = i+1; a[i].valid = true; } a[n].r = -1; while(k--) modify(findSmallest()); dbgShowChain(); return 0; } /* 5 3 1 2 3 4 5 3 1 3 2 1 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现