多模型统一接入实测:聚合方案与独立 API 调用优劣深度对比
2026/6/5 22:26:36
给定一个整数数组a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,…,an,定义其平滑因子为:最长的连续子数组ap,…,aqa_p, \ldots, a_qap,…,aq的长度,其中至多存在一个位置iii(p<i≤qp < i \leq qp<i≤q)满足ai−1>aia_{i-1} > a_iai−1>ai。换句话说,该子数组要么是完全非递减的,要么只包含一次“下降”。
要求对于多个测试用例,分别输出每个数组的平滑因子。
输入格式
输出格式
样例输入
3 1 2 3 1 0 8 1 2 1 2 1 2 3 1 4 1 -10 -100 -100样例输出
3 1 5 3本题要求寻找满足“至多包含一次下降”的最长连续子数组的长度。这里的“下降”指的是ai−1>aia_{i-1} > a_iai−1>ai。换句话说,在子数组中,最多只能有一个位置使得前一个元素大于后一个元素。
我们可以将问题转化为一个滑动窗口问题:
这样,我们通过一次遍历就能找到最长满足条件的子数组。
时间复杂度:O(n)O(n)O(n),每个元素至多被访问两次。
空间复杂度:O(1)O(1)O(1)(不计输入数组)。
// Smooth Factor// UVa ID: 12788// Verdict: Accepted// Submission Date: 2025-12-15// UVa Run Time: 0.010s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;while(cin>>n){vector<int>a(n);for(inti=0;i<n;++i)cin>>a[i];intleft=0,maxLen=1;// 至少长度为1intdropCount=0;// 窗口中下降的次数for(intright=1;right<n;++right){// 判断 right 是否为下降点if(a[right-1]>a[right])dropCount++;// 如果下降次数超过1,移动左边界直到满足条件while(dropCount>1){// 如果 left 是下降点,移出窗口时减少计数if(a[left]>a[left+1])dropCount--;left++;}// 更新最大长度maxLen=max(maxLen,right-left+1);}cout<<maxLen<<"\n";}return0;}以样例1 2 1 2 1 2 3 1为例:
1 2 1 2 3,长度为555。算法过程:
本题通过滑动窗口维护一个至多包含一次下降的连续子数组,在O(n)O(n)O(n)时间内求解。关键在于用dropCountdropCountdropCount记录下降次数,并通过移动左边界保持条件成立。代码简洁高效,适用于大数据范围。