【发布时间】:2013-01-14 15:47:37
【问题描述】:
假设我们有一个数字数组,例如 {1,2,3},我们希望在尽可能少的圈数内使数字相等;其中“转弯”的定义如下:
您需要将其中一个元素的值按原样固定,然后每隔一个数字加 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.01 秒。谁能帮帮我?
据我所知,与 cout/cin 相比,我使用了 scanf/printf 语句,以优化输入/输出部分。但是我还应该做得更好吗?
【问题讨论】:
-
printf不是很快...我怀疑它比cout快。 -
同样存在缓冲区溢出。在循环的最后运行 i = n-1,所以 a[i + 1] 是 a[n],它是 n 长度数组 a 的第 n+1 个元素。
-
您似乎认为数组从索引 1 开始。它们实际上从 0 开始。
-
你可能会使用这样一个事实,即初始最大元素将始终是最大值,除非它在上次迭代中没有增加
-
我想我会先对数组进行排序(可能按降序排列)。然后,您只需遍历阵列即可完成其余的工作。现在你的算法是 O(N^2)。排序将是 O(N log N)。
标签: c++ c algorithm optimization