时间限制:1s 内存限制:32MB

问题描述

回文串是一个正读和反读都一样的字符串,比如level或者noon就是回文串。回文数组也是如此,比如[100,200,100]或者[178,256,256,178]就是回文数组,[1,2,3]和[100,200]不是回文数组。

现在yyy有一个数组,他想仅仅通过合并操作将数组转换为回文数组,

合并操作:将数组中相邻两个的数合并为一个数,合并后的数为合并前两个数的和。例如[1,2,3]通过一次合并操作即可变成回文数组[3,3]。

输入描述

第一行一个整数T(1≤T≤10)表示数据组数。

对于每组数据第一行一个整数n(1≤n≤〖10〗^5),表示数组的长度。

第二行n个整数A_1,A_2,…,A_n (1≤A_i≤10000)分别表示数组中的每个数。

输出描述

对于每组数据输出一行:一个整数表示最少的合并次数。

输入样例

1

3

1 2 3

输出样例

1

【题目链接】:

【题解】



用两个指针,哪个指针指的数字小;则那个指针往中间的方向合并(相邻的);

如果数字相同则两个指针都往中间靠;



【完整代码】

#include <bits/stdc++.h>
#define rep1(i,a,b) for (int i = a;i <= b;i++)
using namespace std;
#define pb push_back;
long long num[100005];
int main()
{
//freopen("D:\\rush.txt","r",stdin);
ios::sync_with_stdio(false);
long long t,n;
long long ans;
cin>>t;
while(t--)
{
cin>>n;
ans = 0;
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
int l = 1,r = n;
while(1)
{
if(num[l]<num[r])
{
num[l+1] = num[l]+num[l+1];
l++;
ans++;
}
else
if(num[r]<num[l])
{
num[r-1] = num[r] + num[r-1];
r--;
ans++;
}
else
{
l++;
r--;
}
if(l>=r) break;
}
cout<<ans<<endl;
}
return 0;
}

最新文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
  2. HDU 4833 Best Financing (DP)
  3. Enable MFA for a user
  4. c# ref 的作用
  5. 到底AR初创公司Magic Leap是不是骗子?我看未必
  6. PHP 下的SSL加密设置
  7. 使Maven 2在package、install等阶段跳过运行Test的配置
  8. JAVA的文件创建
  9. java入门第四步之应用服务器的安装(Tomcat)【转】
  10. IntelliJ IDEA设置自动导入包
  11. if-else的优化举例
  12. SQL 去除小数点后无效 0 的方法
  13. js引用类型数组去重-对象标记法
  14. 201521123069 《Java程序设计》 第3周学习总结
  15. C语言程序设计第二次作业0
  16. Cookies 和session
  17. celery (二) task
  18. Codeup
  19. android adb 流程原理代码分析(一)
  20. h5简易手写板

热门文章

  1. http响应头信息
  2. 关闭防火墙,仍然无法访问80端口 centos
  3. 【python之路20】函数作为参数
  4. 实践中了解到的CSS样式的优先级
  5. Laravel 精选资源大全
  6. MySQL.之 一行内容转换多行
  7. Python 使用BeautifulSoup模块抽取数据
  8. Liferay如何连接本地的数据库
  9. 多云混合云之多集群统一管理:基于阿里云ACK统一纳管多个不同Kubernetes集群
  10. GNN 相关资料记录;GCN 与 graph embedding 相关调研;社区发现算法相关;异构信息网络相关;