0%

2025“钉耙编程”中国大学生算法设计暑期联赛(4)——回忆与展望

思路讲解

赛后自己想出来了

核心代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FOR(i,1,N){
if(cnt[i]==0) continue;
diff[cnt[i]+1]-=1;
diff[1]+=1;
}
// 这个sum维护的就是出现次数
// Sum[i] 表示出现次数大于等于i的数有Sum[i]个
vll Sum(N+5);
FOR(i,1,N){
Sum[i]=Sum[i-1]+diff[i];
}
ll ans=jichu;ll lans=jichu;
FOR(i,2,N){ // 枚举分为i条链的情况
if(Sum[i]<=1) break;
lans+=(Sum[i]-1)*X;
lans-=Sum[i]*Y;
lans+=Z;
ans=max(lans,ans);
}

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1175&rid=12705

心路历程(WA,TLE,MLE……)