转载请注明本文连接http://blog.csdn.net/yangnanhai93/article/details/40536263
题目链接http://ac.jobdu.com/problem.php?pid=1422
这个题目一看,10s,刚上来我就用暴力的方式去求解,果然超时了,汗。。。
后来想想,暴力的方式上可以进行剪枝。
1:我不用计算左和右哪个最小,我直接按照距离来,直接计算就好了,但是需要优先比较左边的。
2:如果左边或右边不存在了,那就直接在另一边找就可以了。
3:需要先排除最小值的情况,这个会方便后面的代码,如果不进行最小值判断,在计算左右满足数的时候还需要考虑输出0的情况,比较麻烦
总是剪枝之后比他们动态规划的结果还要好啦
#include <stdio.h>
using namespace std;
int main()
{
//freopen("data.in","r",stdin);
int A[1000000],n,num,minNum;
scanf("%d",&n);
while(n--)
{
scanf("%d",&num);
minNum=2147483647;
for(int i=0;i<num;i++)
{
scanf("%d",&A[i]);
if(A[i]<minNum)
minNum=A[i];
}
int i=0;
while(i<num&&A[i]>=A[0])
i++;
if(i<num)
printf("%d",A[i]);
else
printf("%d",0);
for (int i=1;i<num;i++)
{
if(A[i]==minNum)
{
printf(" %d",0);
continue;
}
int jl=i,jr=i;
bool isTrue=false;
while(jl>=0&&jr<num)
{
if(A[jl]<A[i])
{
printf(" %d",A[jl]);
isTrue=true;
break;
}
if(A[jr]<A[i])
{
printf(" %d",A[jr]);
isTrue=true;
break;
}
jl--;
jr++;
}
if(!isTrue)
{
while(jl>=0)
{
if(A[jl]<A[i])
{
printf(" %d",A[jl]);
isTrue=true;
break;
}
jl--;
}
while(jr<num)
{
if(A[jr]<A[i])
{
printf(" %d",A[jr]);
isTrue=true;
break;
}
jr++;
}
}
}
printf("\n");
}
return 0;
}
/**************************************************************
Problem: 1422
User: vincent_ynh
Language: C++
Result: Accepted
Time:1110 ms
Memory:4852 kb
****************************************************************/
欢迎喜欢算法的人一起交流 vincent_ynh@163.com