非官方题解 | 巅峰赛#37题解除去T5
2026-08-27 13:19:06
发布于:天津
反馈BUG的帖子
巅峰赛#37题解(没有T5因为不会)
注意:1.这个不是官方题解!2.思路可能不是最优!
1.午枫的幸运名单(实际上并不难。)
思路:
对于每组数据:
- 输入 n 和 p;
- 设置标记变量;
- 输入 n 个字符串,如果和 p 相等直接输出 i(循环变量,从1开始)并标记=1;
- 输入完了,没有匹配到,即标记变量=0,就输出-1。
我的代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int num;cin>>num;
string ren;cin>>ren;
bool flag=0;
for(int i=1;i<=num;i++){
string tp;cin>>tp;
if(tp==ren){
cout<<i<<endl;
flag=1;
}
}
if(!flag){
cout<<-1<<endl;
}
}
return 0;
}
2.宝藏密码
思路:
合法解指的是非负的整数解(即 )。
- 如果只有1个方程,那么直接遍历6种排列求解。因为题目保证只有一个合法解。
- 如果有多个方程:
- 遍历第一个方程的6种情况
- 第一个方程如果出现了合法解,那么再去验证其他方程(每个方程须要验证6种排列),看看是不是通解
- 如果不是通解,那么再重解第一个方程。
- 最后通解就是最终答案
我的代码:
#include<iostream>
using namespace std;
typedef long long _;
struct funk{//一个方程有6种情况
_ a[7];
_ b[7];
_ c[7];
}fangcheng[100002];
bool z(long long a,long long b,long long c){//解是非负整数并且合法
if(a!=0)return (c-b)%a==0&&(c-b)/a>=0;
return 0;
}
int main(){
_ t;cin>>t;
while(t--){
_ n;cin>>n;
for(int i=1;i<=n;i++){
_ a,b,c;
cin>>a>>b>>c;
fangcheng[i].a[1]=a;fangcheng[i].a[2]=a;//傻子式生成6种排列(如果比赛了真不会可以这么做)
fangcheng[i].a[3]=b;fangcheng[i].a[4]=b;
fangcheng[i].a[5]=c;fangcheng[i].a[6]=c;
fangcheng[i].b[1]=b;fangcheng[i].b[2]=c;
fangcheng[i].b[3]=a;fangcheng[i].b[4]=c;
fangcheng[i].b[5]=a;fangcheng[i].b[6]=b;
fangcheng[i].c[1]=c;fangcheng[i].c[2]=b;
fangcheng[i].c[3]=c;fangcheng[i].c[4]=a;
fangcheng[i].c[5]=b;fangcheng[i].c[6]=a;
}
_ ans=0;
if(n==1){
for(int j=1;j<=6;j++){
_ a=fangcheng[1].a[j];
_ b=fangcheng[1].b[j];
_ c=fangcheng[1].c[j];
if(z(a,b,c)){
ans=(c-b)/a;
break;
}
}
}
else if(n>1){
for(int q=1;q<=6;q++){//先解第一个方程
_ a=fangcheng[1].a[q];
_ b=fangcheng[1].b[q];
_ c=fangcheng[1].c[q];
if(z(a,b,c)){//出现合法解
_ jietmp=(c-b)/a;
for(int i=2;i<=n;i++){//解其他方程
bool v=0;
for(int j=1;j<=6;j++){
_ aa=fangcheng[i].a[j];
_ bb=fangcheng[i].b[j];
_ cc=fangcheng[i].c[j];
if(z(aa,bb,cc)&&(cc-bb)/aa==jietmp){
ans=(cc-bb)/aa;
v=1;
break;
}
}
if(!v){//没找到通解,退出,解第一个方程的其他解
break;
}
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
3.午枫的宝藏
思路:
这道题就一个公式。(不会用LaTex......)
那么是怎么推导出来的呢?
- 当n为偶数:争取n/2名水手支持,选择编号为偶数的水手每人分1金币。答案为n(n+2)/4(等差数列)。
- 当n为奇数:争取(n-1)/2名水手支持,选择编号为偶数的水手每人分1金币。答案(n+1)*(n-1)/4。(等差数列)
代码就2个公式自己写。
4.午枫的罗盘
思路
(只给出一个公式,具体怎么出的......举了几个例子,一个一个数,发现总和是几个0 加上 等差数列 加上 几个+2,然后用奥数知识推导的公式。导出来后,一晚上没睡着。)
注意看题

同时,看到T好大,当时 xkl,但也说明我们的时间复杂度必须压到!然后想到推导公式
首先想,k是奇数可能出现直角吗。
答案肯定是不能。学过旋转(小学入门,9年级进阶)的都知道这件事情
——题外话部分开始
当时我用了好几张纸,出了这个公式(你们要信我我导了一晚上推导出了这个雷霆公式):
long long n=floor((num-1.5*k)/k)+2;
long long ans=k*n*(n-1)/2+n*num-k*n*n+0.5*k*n+n;
但是,估计可能也许大概 溢出了,95pts.(别笑我)
细节版本10↓

然后依旧化简了1小时,又双叒[我找不到chuo]用了好几张纸,出了这个公式
——题外话部分结束
式子:
long long q=num/k,r=num%k;
if(2*r<k) ans=q*(k*q+2*r+2)/2;
else ans=(q+1)*(k*(q-1)+2*r+2)/2;
cout<<ans<<endl;
continue;
然后100pts;
我的代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int num,k;
cin>>num>>k;
num--;//因为我的公式,从0开始算的,所以要-1(当时我没减,错了,老师了)
if(k%2==0){ //偶数能凑!
long long q=num/k,r=num%k,ans=0;
if(2*r<k) ans=q*(k*q+2*r+2)/2;
else ans=(q+1)*(k*(q-1)+2*r+2)/2;
cout<<ans<<endl;
continue;
}
cout<<0<<endl;//奇数的话是不可能凑得直角
}
return 0;
}
5.我不会做,所以看官方题解。
6.午枫的密码本
个人感觉出简单了
思路:
不要看到 就吓*了。
想这样一个问题:当 k 大于或等于 [不同字符数] 时会发生什么。(想通了你就会做这道题了)
答案是 LIS 就等于 [不同字符数] 。为什么呢?因为对于每个重复出现的字符串可以选择任意一个字符,我们就可以
- 第一轮,选择ASCLL最小的字符;
- 第二轮,选择ASCLL第二小的字符;
...... - 第 [不同字符数] 轮,选择ASCLL最大的字符。
这样,k 大于或等于 [不同字符数] 时,答案是 [不同字符数] 。
那么如果k不大怎么办,直接用的LIS方式求解!(应该都背下来了)
为什么不会超时?因为:最多不同字符只有不到 100 个,而字符串长度小于 100.
我的代码:(留了很多优化空间)
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string dif(string a){ //算不同字符数量,用桶,注意返回值是string以便比较大小
int tong[129];
for(int i=0;i<129;i++)tong[i]=0;
for(int i=0;i<a.size();i++)tong[a[i]]++;
int ans=0;
for(int i=0;i<129;i++)if(tong[i])ans++;
string anss=to_string(ans);
return anss;
}
int lis(string a){ //正常LIS
char t[20005];int l=0;
for(int i=1;i<=a.size();++i){
char*p=lower_bound(t,t+l,a[i]);
if(p==t+l)t[l++]=a[i];
else*p=a[i];
}
return l;
}
bool daxiao(string a,string b){ //比大小,但是不能直接比较因为直接比较比的是 字典序。这个害得我多错一次(bushi)
if(a.size()!=b.size())return a.size()>b.size();
return a>=b;
}
signed main(){
int t;
cin>>t;
while(t--){
string a,k;
cin>>a>>k;
string ab=' '+a;
//处理k大的情况
string butongzifugeshu=dif(a);
if(daxiao(k,butongzifugeshu)){
cout<<butongzifugeshu<<endl;
continue;
}
//转成数字此时k小于100,原因见思路;
int kt=0;
for(int i=0;i<k.size();i++){
kt+=int(k[i]-48);
if(i!=k.size()-1)kt*=10;
}
//算S'
for(int i=1;i<kt;i++)ab+=a;
cout<<lis(ab)<<endl;
}
}
又及:
是不是出简单了让我一小 * 孩第一次参加比赛得500多分
浅浅预测一下难度(bushi):
这里把普及/提高-拆成了普及 和 普及+/提高-
| 题目 | 难度 | 我的得分 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 | ||
| 总分、排名 |
这题解只要我在任何地方以任何形式用AI我就*全家
全部评论 321
- 置顶
T3代码缺失,但是只有2个公式。
3天前 来自 天津
1所以自己写
2天前 来自 天津
0
以下评论请忽略
从现在开始,所有人禁止发无意义评论违者删评
2026-08-01 来自 河南
242026-08-02 来自 上海
15别顶了
2026-08-02 来自 河南
12希望ac君能看到
2026-08-03 来自 浙江
13
++内容++= 下划线2026-08-07 来自 河南
20d
2026-08-07 来自 江苏
16d
2026-08-07 来自 江苏
17d
2026-08-07 来自 江苏
16
d
2026-07-31 来自 河南
19从现在开始,所有人禁止发无意义评论违者删评2026-08-03 来自 浙江
15只能发送建议或‘支持’的评论,其他评论如‘d’可发但不得多余10次。
2026-08-05 来自 上海
7d
2026-08-06 来自 浙江
4
dd
2026-07-31 来自 河南
9dd
2026-07-31 来自 河南
9exec("import sys\nMOD = 998244353\ndef qpow(a, b):\n res = 1\n while b:\n if b & 1: res = res * a % MOD\n a = a * a % MOD\n b >>= 1\n return res\ninv = lambda x: qpow(x, MOD-2)\ndef get_next(s):\n n = len(s)\n nxt = [0]n\n for i in range(1, n):\n j = nxt[i-1]\n while j > 0 and s[i] != s[j]:\n j = nxt[j-1]\n if s[i] == s[j]:\n j += 1\n nxt[i] = j\n return nxt\ndef kmp_match(pat, nxt, text):\n j = 0\n for i in range(len(text)):\n while j > 0 and text[i] != pat[j]:\n j = nxt[j-1]\n if text[i] == pat[j]:\n j += 1\n return j\ndef calc_val(X, nxt_X, Y, powk):\n l = kmp_match(X, nxt_X, Y)\n res = 0\n while l > 0:\n res = (res + powk[l]) % MOD\n l = nxt_X[l-1]\n return res\ndef calc_P(S, T, n, powk):\n nxt_S = get_next(S)\n nxt_T = get_next(T)\n valSS = calc_val(S, nxt_S, S, powk)\n valTT = calc_val(T, nxt_T, T, powk)\n valST = calc_val(S, nxt_S, T, powk)\n valTS = calc_val(T, nxt_T, S, powk)\n numerator = (valTT - valST) % MOD\n denominator = (valSS + valTT - valST - valTS) % MOD\n return numerator * inv(denominator) % MOD\ndata = sys.stdin.read().split()\nit = iter(data)\ntid = int(next(it))\nt = int(next(it))\nout = []\nif tid <= 8:\n for _ in range(t):\n n = int(next(it)); k = int(next(it))\n S = [int(next(it)) for _ in range(n)]\n T = [int(next(it)) for _ in range(n)]\n powk = [1](n+1)\n for i in range(1, n+1):\n powk[i] = powk[i-1] * k % MOD\n out.append(str(calc_P(S, T, n, powk)))\nelse:\n for _ in range(t):\n n = int(next(it)); k = int(next(it))\n T = [int(next(it)) for _ in range(n)]\n powk = [1]*(n+1)\n for i in range(1, n+1):\n powk[i] = powk[i-1] * k % MOD\n c = 2 if T[0] == 1 else 1\n S2 = [c] + T-1\n out.append(' '.join(map(str, S2)))\nsys.stdout.write
2026-07-31 来自 河南
6有意义吗?!
2026-08-02 来自 北京
1
你无敌了,写正文不就行了,为啥要再跟上撒哈拉沙漠的新闻?是怕重新发一个帖子会没热度吗?
2026-08-08 来自 浙江
7d
2026-08-08 来自 浙江
0zc
2026-08-12 来自 浙江
1其实 0 个人想看新闻。花了一年时间都没找到正文在哪
2026-08-12 来自 浙江
2
d
2026-07-31 来自 浙江
5dd
2026-07-31 来自 河南
6d
2026-08-04 来自 浙江
1d
2026-08-14 来自 广东
0
dd
2026-07-31 来自 河南
5哇,刚刚到了榜一,就在刚刚
2026-08-06 来自 浙江
4question:站务帖应该出现在哪个榜上?
2026-08-06 来自 浙江
4......可以加上
2026-08-08 来自 河南
0
dd
2026-07-31 来自 河南
4dd
2026-07-31 来自 河南
4d'd
2026-07-31 来自 上海
4dd
2026-07-31 来自 河南
4dd
2026-07-31 来自 河南
4d'd
2026-07-31 来自 上海
4dd
2026-07-31 来自 河南
3
dd
2026-07-31 来自 上海
4欢迎注册 ZDZL 论坛:https://bbs.zdzltop.com/,本论坛氛围开放,可以讨论任何灌水的内容。近期有创作激励,如果写出好文章好帖子,会有现金奖励!如果您不会注册可以私信wcqk为你提供账号。感谢您的支持!
同时欢迎您注册 ZDZL OJ:https://oj.zdzltop.com/,OJ 题目数量比较多,题目难度范围广,适合用来备战 CSP 与 GESP,这个如果你想注册,也可以私信wcqk
2026-08-14 来自 浙江
0
是又双叒叕(zhuo,第二声)
1周前 来自 上海
3希望帖主能改一下
1周前 来自 上海
2
这次巅峰是不是出简单了
2026-08-14 来自 天津
35733280
5733279
这两个人
一个51秒两题一个22秒一题,演都不带演的,气笑了,不过他们的AI(也许吧)性能挺好,算的挺快2026-08-14 来自 浙江
5细节ID连续,应该是连着注册的(我不太确定)
2026-08-14 来自 北京
4AI实在是太好用了你们知道吗
1周前 来自 浙江
4
那你这么多 d 是何意味,和你之前发的有啥区别吗
2026-08-01 来自 浙江
3bur你要不要看看发布时间
2026-08-01 来自 河南
0原帖新改
删两百条评论了删不完2026-08-01 来自 河南
1这是我和管理员说的
我还想说: 引言----对公平的诉求,也是想要推动平台变得更好的真心。 1.我认为ACGO管理层存在一定的腐bài(请一定原谅我这样说,原因见下) - 某些所谓的管理员对于我们这些凡人爱答不理;消息发出去就像石沉大海,连一个“收到”都没有。 - 但是对于某些dàlǎo表现出了“呕心沥血”的形态,如@一下就能秒回等 *我入站这一个月来,累计提出 - 4次有效题目错误(3处题面大面积缺失、一处表述存在严重歧义,都直接影响了答题体验) - 1个BUG(这次除外) - 2个有效建议(这次除外,都是能让平台更完善的实用想法) - 多个有效(没数)违规账号举报(如一天做对几千题的、伪装官方并诈骗的人等) 但没有一个、没有一次是成功的。那些我花时间整理的图、写的说明,就像被丢进了黑洞,连一点涟漪都没激起。 同时限于未关注只能发一个私信,导致我很难完整表述某些问题,很难做到说清楚前因后果。 可惜,这些帖子有的已被删除,连我曾经努力过的痕迹都要抹去。 ...... ...... 2.上述这也是此次A+B事件的动机所在(虽然我知道这种方法不对) 正是在这样中,我做出了过激的行为。当时我认为既然普通人提不出来建议,发帖没人看,那么就刷一下热度让自己“有名”再提建议和意见,并且采用了过激的“博眼球”方式。 这是在常规渠道失效后,被逼出来的“破局”方式——用热度让自己被看见,才有机会传递自己的诉求。 3.因为有了你,事情才终于结束 谢谢你! 正是因为愿意在一个“普通人”上花1.5小时,认真听我的言语,让我终于感觉自己被看见了。 你没有像某些管理员那样敷衍,也没有觉得我在无理取闹,这份理解,比任何回应都更让我安心。 原来,被看见的感觉,这么温暖。 ...... sczans. 2026.8.12026-08-01 来自 河南
1
十里长街送A+B problem
我才想到原来这是改的十里长街送总理,现在的人真的是什么梗都能玩的啊,评论区还有跟发的,你GO的风气太棒了
2026-08-01 来自 天津
3你来干甚么
2026-08-01 来自 河南
1没干甚么,111
2026-08-01 来自 天津
1到家了
2026-08-11 来自 天津
1






























































有帮助,赞一个