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大家能考出好成绩

 

 

posted @   KevinLikesCoding  阅读(293)  评论(3编辑  收藏  举报
编辑推荐:
· .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
点击右上角即可分享
微信分享提示