csp-j 复赛感想
作者:博客园小蔡编程
这次是作者第一次参加csp-j的比赛
内心还是挺激动的
今天,作者就来和大家讨论一下这次csp-j的学习心得和感想
T1 分糖果
这题描述看似复杂
其实就是一道求最大取模的题
L<=k<=R
求k%n的最大值
有多种方法
作者这里目测100
#include <cstdio> #define ll long long ll n,l,r; int main(){ freopen("candy.in","r",stdin); freopen("candy.out","w",stdout); scanf("%lld%lld%lld",&n,&l,&r); ll m=l%n; m=n-m-1; if(l+m>r) printf("%lld",r%n); else printf("%lld",n-1); return 0; }
T2 插入排序
着道题是经典的模拟
只要把插入排序换成二分就行了
但是作者比赛时为了更多的分数
先做后面的题,成功获得了大约120分
这题只拿了一半的分数
#include<bits/stdc++.h> using namespace std; const int N=8e3+10; int n,q; struct node{ int n,d; } a[N]; int p,v,u; int cr(int g){ node x[N]; for(int i=1;i<=n;i++){ x[i].n=i; x[i].d=a[i].d; } for (int i = 1; i <= n; i++) for (int j = i; j>=2; j--) if ( x[j].d < x[j-1].d ){ int t=x[j].d; int f=x[j].n; x[j].d=x[j-1].d; x[j].n=x[j-1].n; x[j-1].d=t; x[j-1].n=f; } int res; for(int i=1;i<=n;i++) if(x[i].n==g) { res=i; break; } return res; } int main(){ freopen("sort.in","r",stdin); freopen("sort.out","w",stdout); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&a[i].d),a[i].n=i; for(int i=1;i<=q;i++){ scanf("%d",&p); if(p==1){ scanf("%d%d",&v,&u); a[v].d=u; }else{ scanf("%d",&v); printf("%d\n",cr(v)); } } //for(int i=1;i<=n;i++) printf("%d ",a[i].d); return 0; }
T3 网络连接
这题的数据量很弱,n<=1000,不会超时
但是这题的关键点在于判断IP是否正确
需要写很麻烦的if语句
比如说:10:2.3.1.2 (这IP作者一开始就没考虑到)
所以目测65分
#include <bits/stdc++.h> using namespace std; const int N=1e3+10; int n; string op,ad; int a,b,c,d,e; int da[N][7],dal; int sop(string x){ int res[10],l=1; int v=0; for(int i=0;i<x.size();i++){ if(x[i]=='.'&&l<4) res[l++]=i; else if(x[i]=='.'&&l==4) v=1; else if(x[i]==':'&&l==4) res[l++]=i; else if(x[i]==':'&&l!=4) v=1; } if(v) return 0; a=0; b=0; c=0; d=0; e=0; for(int i=0;i<res[1];i++){ a=a*10+int(x[i])-48; if(a==0&&i==1) v=1; } for(int i=res[1]+1;i<res[2];i++){ b=b*10+int(x[i])-48; if(b==0&&i==1) v=1; } for(int i=res[2]+1;i<res[3];i++){ c=c*10+int(x[i])-48; if(c==0&&i==1) v=1; } for(int i=res[3]+1;i<res[4];i++){ d=d*10+int(x[i])-48; if(d==0&&i==1) v=1; } for(int i=res[4]+1;i<x.size();i++){ e=e*10+int(x[i])-48; if(e==0&&i==1) v=1; } if(a>255) v=1; if(b>255) v=1; if(c>255) v=1; if(d>255) v=1; if(e>65535) v=1; if(v) return 0; return 1; } int sad(){ int v=0; for(int i=0;i<dal;i++){ if(a==da[i][0]&&b==da[i][1]&&c==da[i][2]&&d==da[i][3]&&e==da[i][4]) { v=i+1; break; } } if(v) return v; return 0; } int main(){ freopen("network.in","r",stdin); freopen("network.out","w",stdout); cin >> n; for(int i=1;i<=n;i++){ cin >> op >> ad; if(op=="Server"){ if(sop(ad)){ if(sad()==0){ da[dal][0]=a; da[dal][1]=b; da[dal][2]=c; da[dal][3]=d; da[dal][4]=e; da[dal++][5]=i; cout << "OK" << endl; } else{ cout << "FAIL" << endl; } } else{ cout << "ERR" << endl; } }else{ if(sop(ad)){ int sadn=sad(); if(sadn){ cout << da[sadn-1][5] << endl; } else{ cout << "FAIL" << endl; } } else{ cout << "ERR" << endl; } } } return 0; }
T4 小熊的果篮
随便说一句:为什么去年和今年T4的主人公都是小熊?
这道题的关键点在读题
块有可能合并
所以要不断重新扫描块
作者用了前缀和来计算块
目测70分
#include <bits/stdc++.h> using namespace std; const int N=2e5+10; int n,m; int a[N],c[N],g[N],b[N],k[N]; int main(){ freopen("fruit.in","r",stdin); freopen("fruit.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } while(n>m){ int l=1; for(int i=1;i<=n;i++){ if(g[i]==0) { b[l++]=a[i]; k[l-1]=i; } } for(int i=1;i<l;i++){ c[i]=1; if(b[i]==b[i-1]&&i>1)c[i]=c[i-1]+1; } int v=0; for(int i=1;i<l;i++){ if(c[i]==1) { if(v) printf(" "); v=1; printf("%d",k[i]); m++; g[k[i]]=1; } } printf("\n"); } return 0; }
感想
这次csp-j的数据都很良心
作者暴力枚举也能得很多分
而读题尤其重要
T3 IP的判断正误 和 T4 块的合并
不要考试时纠结一道题
可以先把所有题暴力做一遍,拿到分数,再优化
现在洛谷民间数据100+52+65+70
希望这次csp大家能考出好成绩
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App