NOIP2025 【颓废记】

· · 生活·游记

省流

估分:[0,80]+[12,16]+0+0=[12,96]

前言

坐标:GD-FS(去中山纪念中学比赛)

初一蒟蒻(我是真菜可以看CSP游记)

而我居然被GP用奖励名额去了NOIP,学校是CSP考场的好处,但是我这个连CSP-J都没1=的人去打NOIP有什么用呢?(我这个黄题都不能稳切的人有什么用呢?)

Day -∞∞

比完CSP后gp和初二的dalao们唠叨了一些noip的事情,但是我那时候是想都不想的,毕竟我在校队S组在非零的算倒数了QwQ

Day -∞

突然意识到除了几个自己就可以进noip的dalao好像奖励的名额我也可以进去,但是我不知道学什么,gp说要看书但也不知道怎么看,所以就一直颓废到比赛了

Day -4~-1

这里学一点哪里学一点,但是好像最后什么都没学到呜

然后在洛谷上面找到些能写题解的题目,而且我都会,但是因为我挺菜的,所以提交了很多次也被打回了很多次所以就写了两篇特别简单的,而且有两篇写好了却因为格式太多不行的了,就改了很多次最后还是不能写了,就杂七杂八的不知道在干什么。总之就是特别颓废吧。

Day 0

到周五啦,早上就一直在机房,依旧不知道要干什么,看到有人在赌不会考串串所以我一直都没复习,打了一下线段树模板,因为暑假学的忘的七七八八了awa。

第二节课看到同班的whker在体测,我就那样从操场走去宿舍挑衅他们

11:40 去食堂吃饭,和同班的whker打声招呼做最后的告别(bushi)

12:17 出发啦(但是要去接sm和少科院的dalao们)

15:?? 到酒店了

下午和晚上除了吃饭都是在用手提刷dy属于颓废了

晚饭挺好吃的,他们给其他人的杯子里倒满了茶叶茶,这素在?....

发癫乎?

Day 1

早上在酒店吃早餐,拿了杯咖啡但是全是奶沫,还挺烫的,可能是我没品味就喝了一口qwq

学校给了士力架和德芙巧克力,但是不给带进去...

到纪中旧科学馆了,挺有年代感的,旧科学馆一定要旧,但是电脑也挺旧的,键盘也挺难按下去的,没有NOI Linux怎么办呐?受着,编译一次要八九秒,而mohay大佬说他就编译个A+B也是一样的。

我就写了T1和T2,而且我都没写多好

T1 candy

题目传送门

考场上的想法:

估分:[0,80],我会不会挂分呢?不知道。(若不挂分:65+10+5=80pts)

这是一道明摆着的贪心题目

先把x数组和y数组用一个结构体存起来:我用的是 a[i].xa[i].y ,这里当做一组,将每一组的总和从小到大排序,优先选择最小的那一组,用 k 存储 a[1].x+a[1].y

同时用一个x数组存每一组的第一个,从小到大排序,为下文做铺垫

然后用一个循环枚举多少组k,我们可以用一个小小的优化:用一个变量 s 累加 x 数组,也就是算出每种单数颗糖果的总和,然后就进行一个 'for(int i=(m-s)/k;i<=m/k;i++)' 这里的 (m-s)/k 就是一共的价钱减去s再除最便宜的那一组,一直到价钱除以最便宜的那组即可。下面就进行一个暴力,枚举到第 i 组最多可以买多少颗糖,在使用一个ma来打擂台就好了

下面给出考场上核心的暴力代码

for(int i=(m-s)/k;i<=m/k;i++){
    int k1=i*k,ans=i*2;
    for(int j=1;j<=n;j++){
        if(k1+x[j]<=m)
            k1+=x[j],ans++;
        else 
            break;
    }
    ma=max(ma,ans);
}
笑点解析:在回酒店的路上突然想到(疑似)正解,反正在洛谷交上去是对了!

直接放代码吧反正自己看得懂

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x[100005],s[100005],ans,ma,k;
struct ff{
    int x,y;
}a[100005];
bool cmp(ff a,ff b){
    if(a.x+a.y!=b.x+b.y)
        return a.x+a.y<b.x+b.y;//按总价格从小到大排序
    return a.x<b.x;//不知道有什么用...
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&a[i].x,&a[i].y);
        x[i]=a[i].x;//上文提到的x[i]是奇数颗糖果的价格
    }
    sort(a+1,a+n+1,cmp);//结构体排序
    sort(x+1,x+n+1);//x数组排序
    k=a[1].x+a[1].y;//最便宜的一组
    for(int i=1;i<=n;i++)//前缀和
        s[i]=s[i-1]+x[i];
    for(int i=0;i<=n;i++){//枚举奇数颗糖的数量(有序的)
        if(s[i]<=m){//如果钱够花
            int ans=i;
            ans=ans+(m-s[i])/k*2;//当前在i的基础上再加上剩下的钱除k乘上一组有两颗糖果
            ma=max(ma,ans);//更新最大值
        }
    }
    cout<<ma;
    return 0;
}

T2 sale

题目传送门。

这题我用的是暴力的代码(时间复杂度为 O(2^n) ),就是最简单的dfs,在判断一下符不符合,如果符合的话就 ans++ ,不然的话就不管它;再判断A性质符不符合,而我就发现了一个规律,如果是A性质符合的话呢,那么不管 m 是多少,答案都是2^n

估分:[12,16]pts

忘记A性质有没有初始化了

Code[16pts]

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Mod=998244353;
int op,t,n,m,a[5005],k[5005],ans,A;
struct ff{
    int a,k;
    double xjb;
};
bool cmp(ff a,ff b){//按照性价比排序
    if(a.xjb!=b.xjb)
        return a.xjb>b.xjb;
    return a.a>b.a;
}
bool pd(){//判断条件
    int dp[5005],ma=0,sum=0,k1=0;
    ff x[5005];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        x[i].a=a[i],x[i].k=k[i];
        x[i].xjb=a[i]*1.0/k[i];
        for(int j=m;j>=k[i];j--)//01背包
            dp[j]=max(dp[j],dp[j-k[i]]+a[i]),ma=max(ma,dp[j]);
    }
    sort(x+1,x+n+1,cmp);
    for(int i=1;i<=n;i++){//小R的方案
        if(k1+x[i].k<=m)
            k1+=x[i].k,sum+=x[i].a;
    }
    return sum==ma;
}
void dfs(int n1){//正常的dfs
    if(n1==n+1){
        if(pd())
            ans++;
        return;
    }
    k[n1]=1;
    dfs(n1+1);
    k[n1]=2;
    dfs(n1+1);
    k[n1]=0;
    return;
}
signed main(){
    scanf("%lld%lld",&op,&t);
    while(t--){
        ans=0;
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            if(i>=2&&a[i]!=a[i-1])
                A=0;
        }
        if(A){//如果符合A性质
            ans=1;
            for(int i=1;i<=n;i++){//二的n次方
                ans=ans*2;
            }
            cout<<ans<<"\n";
            continue;
        }
        dfs(1);
        cout<<ans<<"\n";
    }
    return 0;
}

总结

此次NOIP总体的心情不是很好,主要是因为键盘太难按下去了,而且没有NOI Linux,编译一次也需要9~10s,就是有点敷衍我这种奖励名额的蒟蒻吧,嗯对

把电脑设备放下不说,我的状态不是特别好,第一题差一点想到正解,倘若距比赛结束 20-30min 在想一下T1就可能可以 100pts 了,而T2理解题意花了 30-45min (证实了我语文85/120的水平)。有点蒻了。

不过这也算是过去了,就把这当成一次练习就好了,就回归先whk吧

唉,可怜的LJW不能来NOIP,还大骂了GDOI一场