[COCI2016-2017#2] Nizin
题目描述
设 A A A 是一个含有 n n n 个元素的数组,其中各元素的编号为 1 … n 1\dots n 1…n。若对于任意整数 i ∈ [ 1 , n ] i\in [1,n] i∈[1,n] 都有 A i = A n − i + 1 A_i=A_{n-i+1} Ai=An−i+1,则称 A A A 是一个「回文数组」。
Mislav 可以通过以下方式修改一个数组:
- 选择两个相邻的元素。
- 将这两个元素替换为一个新的元素,值为它们的和。
现在,给出一个数组。请你计算在至少多少次修改后,Mislav 可以将其修改为一个「回文数组」。
输入格式
第一行一个整数 n n n,表示数组中元素的个数。
接下来一行 n n n 个整数 a i a_i ai,表示数组中的元素。
输出格式
一行,一个整数,表示 Mislav 至少需要修改数组的次数。
样例 #1
样例输入 #1
3
1 2 3
样例输出 #1
1
样例 #2
样例输入 #2
5
1 2 4 6 1
样例输出 #2
1
样例 #3
样例输入 #3
4
1 4 3 2
样例输出 #3
2
提示
【样例解释】
使用 [] 标记 Mislav 修改时所选择的两个数。
样例 1 解释
[1 2] 3 -> 3 3。
样例 2 解释
1 [2 4] 6 1 -> 1 6 6 1。
样例 3 解释
[1 4] 3 2 -> 5 [3 2] -> 5 5。
【数据规模与约定】
- 对于 30 % 30\% 30% 的数据,保证 n ≤ 10 n \leq 10 n≤10。
- 对于 60 % 60\% 60% 的数据,保证 n ≤ 1 0 3 n \leq 10^3 n≤103。
- 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 6 1\le n\le 10^6 1≤n≤106, 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1≤ai≤109。
【说明】
题目译自 COCI2016-2017 CONTEST #2 T3 Nizin。
C++实现
#include
const int MAXN=1000000+10;
long long p[MAXN];
int main(){
int n;
scanf(“%d”,&n);
for(int i=1;i<=n;++i){
scanf(“%lld”,&p[i]);
}
int l=1,r=n,cnt=0;
while(l<r){
if(p[l]>p[r]){
–r;
p[r]+=p[r+1];
++cnt;
}
else if(p[l]<p[r]){
++l;
p[l]+=p[l-1];
++cnt;
}
else{
++l,–r;
}
}
printf(“%d”,cnt);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++信奥P6496普及组提高 COCI2016-2017#2 Nizin&spm=1001.2101.3001.5002&articleId=144771216&d=1&t=3&u=cd6e26594d0d44f598ebe673dd963fb5)
548

被折叠的 条评论
为什么被折叠?



