假设我们有一组数字{1,2,3}并且我们希望尽可能少地轮换数字,其中的“转”的定义如下:优化C代码
在转弯时,你需要修复的元素之一的值是,和1
增加每隔数考虑到如。已经提到 - A = {1,2,3},目标是均衡它们。我已经完成的是制定逻辑,即使用最小圈数的方法是在每一回合中选择最大数量。
迭代1:保持A [2] = 3。迭代结束时的阵列=> {2,3,3}
迭代2:保持A [2] = 3。阵列在迭代的结束=> {3,4,3}
迭代3:保持A [1] = 4。阵列在迭代的结束=> {4,4,4}
所以,采取匝数= 3
我写的代码如下:
#include<iostream>
#include<stdio.h>
int findMax(int *a,int n)
{
int i,max;
max=1;
for(i=2;i<=n;i++)
{
if(a[i]>a[max])
{
max=i;
}
}
return max;
}
int equality(int *a,int n)
{
int i;
for(i=1;i<n;i++)
{
if(a[i]!=a[i+1]) return 0;
}
return 1;
}
int main()
{
int a[100],i,count,t,posn_max,n,ip=0;
scanf("%d",&t);
while(ip<t)
{
count=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
while(equality(a,n)==0)
{
posn_max=findMax(a,n);
for(i=1;i<=n;i++)
{
if(i!=posn_max)
{
a[i]=a[i]+1;
}
}
count++;
}
printf("%d\n",count);
ip++;
}
return 0;
}
这给我正确的答案,我需要好的。但我想进一步优化它。
我的时间限制为1.0秒。但法官网站告诉我我的代码需要1.01s。谁能帮我吗?
相比COUT/CIN,力图优化输入/输出部据我所看到的,我使用的scanf/printf语句。但还有什么我应该做得更好?
'printf'不是很快......我怀疑它比'cout'快。 – leemes
同样存在缓冲区溢出。在循环i = n-1的最后一次运行中,所以a [i + 1]是一个[n],它是n长度数组a的第n + 1个元素。 – SecurityMatt
您似乎认为数组从索引1开始。它们实际上从0开始。 –