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数组用一个结构体存起来:我用的是
同时用一个x数组存每一组的第一个,从小到大排序,为下文做铺垫;
然后用一个循环枚举多少组k,我们可以用一个小小的优化:用一个变量
下面给出考场上核心的暴力代码
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
题目传送门。
这题我用的是暴力的代码(时间复杂度为
估分:[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,就是有点敷衍我这种奖励名额的蒟蒻吧,嗯对
把电脑设备放下不说,我的状态不是特别好,第一题差一点想到正解,倘若距比赛结束 (证实了我语文85/120的水平)。有点蒻了。
不过这也算是过去了,就把这当成一次练习就好了,就回归先whk吧
唉,可怜的LJW不能来NOIP,还大骂了GDOI一场