洛谷P8183题解
本文同步更新于洛谷博客
题目描述
给定序列 ,每次操作可以合并相邻的两个数,求使得序列中所有数相等的最小操作次数。
题解
设 ,因为合并不会影响 ,所以我们可以枚举 的因数作为最后序列中的数值。
假设 为 的某个因数,从左到右进行如下操作:若 ,则让 加上当前数;若 ,则将 清零,即前面枚举的数合并成 ;若 ,则此种情况不可行。
最后,由于要求最小操作次数,所以我们要让每个数尽量的小,将 的因数从小到大枚举,一找到答案 break
即可。
Code
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,s,cnt,a[maxn],p[1005],res,ans;
bool flag;
int main()
{
scanf("%d",&t);
while(t--)
{
flag=ans=cnt=s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
flag|=(a[i]!=a[1]);
s+=a[i];
}
if(!flag)
{
printf("0\n");
continue;
}
for(int i=1;i<=s;i++)
{
if(s%i)
continue;
p[++cnt]=i;
}
for(int i=1;i<=cnt;i++)
{
res=ans=0;
for(int j=1;j<=n;j++)
{
res+=a[j];
ans++;
if(res==p[i])
{
res=0;
ans--;
}
if(res>p[i])
goto L;
}
break;
L:;
}
printf("%d\n",ans);
}
return 0;
}
本文作者:Ginger_he
本文链接:https://www.cnblogs.com/Gingerhe/p/15966083.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步