RoboContest Round 103(pi Round)比赛题解
A
\(*\color{brown}{405}\)
太简单了,不讲了。
#include<iostream>
#include<cstring>
using namespace std;
int t,n;
string s;
int main(){
cin>>t;
while(t--){
cin>>n>>s;
int ans=0;
for(int i=0;i<n;i++){
if(s[i]=='1'){
ans=n-1-i;
break;
}
}
cout<<ans<<endl;
}
return 0;
}
B1
\(*\color{green}{821}\)
定义 \(p_i\gets a_ik,q_i\gets\lfloor\frac{a_i}{k}\rfloor\) ,那么求 \(p\) 和 \(q\) 的非空最大子段和取个 max 输出就好了。
B2
\(*\color{cyan}{1221}\)
我们先只考虑 \(k\ge 0\) 的情况。
我们定义区间 \([l_1,r_1]\) 严格包含区间 \([l_2,r_2]\) 当且仅当 \(l_1\le l_2,r_1\ge r_2\) 且 \((l_1,r_1)\neq (l_2,r_2)\) 。
- Observation 1 : 假设我们操作了区间 \([l,r]\) ,最终最大子段和取的是区间 \([l_2,r_2]\) ,那么 \([l_2,r_2]\) 与 \([l,r]\) 之间要么互不相交,要么存在包含关系,且 \([l,r]\) 不能严格包含 \([l_2,r_2]\) 。
证明:如果有相交且不包含的情况或 \([l,r]\) 严格包含 \([l_2,r_2]\) 的情况,可以缩短 \([l,r]\) 使其满足包含关系。
那么接下来令 \(l_i=\max\limits_{j=1}^{i+1}(\sum\limits_{k=j}^i a_k),r_i=\max\limits_{j=i-1}^n(\sum\limits_{k=i}^j a_k)\) ,\(p_i=\lfloor\frac{a_i}{k}\rfloor\) , \(q_i=a_ik\) 。
那么答案就变成了 \(\max(\max\limits_{1\le i\le j\le n}(l_{i-1}+r_{j+1}+\sum\limits_{k=i}^j p_k),\max\limits_{1\le i\le j\le n}(l_{i-1}+r_{j+1}+\sum\limits_{k=i}^j q_k))\) 。
这个直接暴力扫一遍就行了,复杂度 \(O(n)\) 。
然后我们再来考虑 \(k<0\) 的情况,容易发现和刚才的分析一模一样,因此不讲了。
难绷,上面的读错题了,我们姑且称之为 B2 。

浙公网安备 33010602011771号