2024 CSP-J2/S2 游记

欧阳逸owen

2024-10-26 22:14:40

Life & Travel

此游记为献祭自己的第3年正式信竟生涯(虽然我很菜...)。

坐标:GD-SZ

2023年:

10.16日夜 在家突发39℃高烧 5天高烧不下 10.20勉强退烧

10.21日 J组复赛翻车(T1数组开小,T2忘开double,T3T4基本上没兴致了) 60分

2023年总结:因为一整年长时间的熬夜,我的身体明显变差了 造成我最后的失利

2024年:

1月~7月 搞学科

7.15日~8.31日 暑假集训 把提高组算法全部过了一遍 然后也将普及组算法复习了一遍

9.21日 2024CSP-J1/S1初赛稳稳过掉

10.1日~10.7日 国庆集训 不断复习 只为拿奖

10.8日~10.24日 每日下午一直集训 准备比赛

10.25日 前往GD-SZ边疆地区:SZ高级中学高中园(CCF是没钱了吗 选这种地方

2024.10.26

距离2024CSP-J2/S2还有-1天

开头想说的事:CCF选的学校请别太抽象

凌晨1点睡着 早上6点半起床 7点去考点(谁说会堵车的????

7:30 进入考点,运气挺好的,第二个进考点

8:00 前往考场,进入考场

CCF为啥不让带纸巾进考场,我这种重度鼻炎患者怎么办???

8:30 CSP-J2开始。

我先在DEV上打了个模板,等到监考老师发解压码之后解压看题。

T1

一看题面,这么大一张扑克牌图片,以为很难,结果一看题目,挖草,这不纯纯map练习题吗,直接判断一下是否标记过,没标记过的就标记,并从52张牌中减少一张需要拿的牌,标记过的不管。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
map<string,bool> mp;
ll n,ans=52;
int main(){
    cin >> n;
    for(int i=1;i<=n;i++){
        string s;
        cin >> s;
        if(mp[s]==0){
            mp[s]=1;
            ans--;
        }
    }
    cout << ans;
    return 0;
}

T2

一看题面,这不纯纯简单DFS搜索题吗,拿vis数组标记一下就可以了,于是,我就写出了一下代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e3+10;
char c[N][N];
ll ans; 
bool vis[N][N];
ll n,m,k;
void dfs(ll x,ll y,ll d,ll temp){
//  cout << x << " " << y << " " << d << " " << temp << " " << ans << endl;
    if(!vis[x][y]) vis[x][y]=1;
    if(temp==0){
        return ;
    } 
    if(d==0){
        if(y+1>m||c[x][y+1]=='x'){
            dfs(x,y,1,temp-1);
        }
        else dfs(x,y+1,d,temp-1);
    }
    else if(d==1){
        if(x+1>n||c[x+1][y]=='x'){
            dfs(x,y,2,temp-1);
        }
        else{
            dfs(x+1,y,d,temp-1);
        }
    }
    else if(d==2){
        if(y-1<1||c[x][y-1]=='x'){
            dfs(x,y,3,temp-1);
        }
        else dfs(x,y-1,d,temp-1);
    }
    else{
        if(x-1<1||c[x-1][y]=='x'){
            dfs(x,y,0,temp-1);
        }   
        else dfs(x-1,y,d,temp-1);
    }
    return ;
}
ll x,y,d;
void solve(){
    ans=0;
    cin >> n >> m >> k;
    cin >> x >> y >> d;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin >> c[i][j];
            vis[i][j]=0;
        }
    }
    dfs(x,y,d,k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(vis[i][j]) ans++;
        } 
    }
    cout << ans << endl;
    return ;
}
ll T;
int main(){
//  freopen("explore.in","r",stdin);
//  freopen("explore.out","w",stdout);
    cin >> T;
    while(T--) solve(); 
    return 0;
}

然后测了测大样例,发现最后一个跑不过,我寻思着是不是TLE了,于是,我考场上就想了一个奇怪的假优化方法,调了接近1个半小时,才把样例重新过掉,然后发现,大样例还是跑不过,我看时间不早了,我就跳题看下一题了,代码也没改了。 代码我也不放了,上面那个代码才是正解。

T3

第一眼,简单题目;第二眼,可以打表;第三眼,有规律!!!

我通过纯暴力算法将n=1~50的情况全部输出出来,发现了规律,所有n>20的情况,前面不一定都是8,但是除了前2位或前3位都出现了8,同时,题目中的特殊性质(保证n是7的倍数已经提醒的很明显了)

我的写法和大部分人不一样,但其实就是这个道理:除了前2位或前3位都出现了8,我只是通过暴力算的前2位和者前3位比较谁小就输出谁。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll a[N];
const ll cnt[15]={6,2,5,5,4,5,6,3,7,6};
ll T;
ll count(ll x){
    ll ans=0;
    ll temp=x;
    while(temp){
        ans+=cnt[temp%10];
        temp/=10;
    }
    return ans;
}
ll num(ll x){
    ll a=1;
    while(1){
        if(count(a)==x){
            return a;
        }
        else a++;
    }
    return 1;
}
int main(){
    cin >> T;
    while(T--){
        ll x;
        cin >> x;
        if(x<=1){
            cout << -1 << endl;
            continue;
        }
        if(x<=20){
            cout << num(x) << endl;
            continue;
        }
        ll t1=x/7-1,t2=x/7-2;
        ll m1=num(x-(t1*7))*10+8;
        ll m2=num(x-(t2*7));
        cout << min(m1,m2);
        if(m1<m2){
            for(int i=1;i<=t1;i++){
                cout << 8;
            }
        }
        else{
            for(int i=1;i<=t2;i++){
                cout << 8;
            } 
        }
        cout << endl;
    } 
    return 0;
}

T4

一眼题目,感觉像是建图,但是时间不够了,直接 可以总司令

估分:100+70+100+0=270

最后15分钟,回去看T2,还是找不到为啥爆掉,时间复杂度是O(K) 不可能有问题,最后只能交上去一个有点小问题但不多的代码。

出考场

出了考场,一问为啥我T2大样例会没输出,原来是因为Windows系统会爆栈,但不是TLE,时间复杂度O(K),用我一开始写的代码都能过,哭扣40分(洛谷民间数据)。

吃饭

家长们从外面打包了饭菜在食堂吃,食堂很大,很新,就是椅子怎么这么抽象,不给我们靠背。。。。

饭后总结了一下J组。

13:30 进礼堂准备进考场

14:00 进考场(爬了7层楼,真服了啊)、

14:30 CSP-S2开始

T1

一看题面,显然的双指针,直接排序,通过双指针模拟即可,代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll a[N];
ll n;
int main(){
    cin >> n;
    for(int i=1;i<=n;i++) cin >> a[i];
    sort(a+1,a+1+n);
    ll i=1,j=1;
    while(i<=n&&j<=n){
        if(a[i]>=a[j]){
            j++;
        }
        else{
            i++;
            j++;
        }
    }
    cout << j-i << endl;
    return 0;
}

T2

根据题面给出的公式,分类讨论每一个车的加速度a=0、a<0、a>0,算出他们速度变为V时的位置或者区间,再通过二分计算即可。 写了2小时,样例过了,但是样例组一直过不了,后面直接放弃,转成写特殊点。 代码无。

T3

看完题目,啥也不会,直接爆搜,骗他个20分。 代码无。

T4

看不懂题,卒。

估分:100+25+20+0=145

总结

J组T2发挥失常了,不过确实不知道Windows会爆栈,但是Linux上就没问题,希望能有一等奖。 S组其实比预想的要好,希望有个二等奖吧。

最终得分

J:100+40+100+0=240

S: 100+20+0+0=120

这个赛季还未结束 还有USACO呢 继续努力!!!