当前位置:首页 > 问答大全 > 高分求一道ACM编程题:一道我自己超时的题,求大神说一下思路,比较水的题

高分求一道ACM编程题:一道我自己超时的题,求大神说一下思路,比较水的题

被浏览: 0次 2023年06月23日 10:42
热门回答(4个)
游客1

采用动态规划来做吧。
假设a[0]=1,a[1]=5,a[2]=6,a[3]=3,a[4]=7,a[5]=8
d[i][j]表示a[i][j]之间的最大分差
可见d[0][0]=d[1][1]=...=d[5][5]=0
d[0][1]=4
d[1][2]=1
d[2][3]=3
d[3][4]=4
d[4][5]=1
下面就是动态规划的递推方程了。为:
d[i][j]=max{d[i][j-1], d[i+1][j], abs(a[i] - a[j]) }
比如d[0][2] = max{ d[0][1], d[1][2], abs(1 - 6) } = max {4, 1, 5} = 5
使用这种方式计算出任意逗激两个点之间的d[i][j]。
然后搜指弯就读取输入,直接世闷输出结果就好了。

游客2

#include
void main()
{
int data[100],totol[100],N,M,i,j,left,right,max,min;
scanf("%d%d",&N,&M);
for(i=0;i<蠢森脊N;i++)
scanf("%d",&data[i]);
for(i=0;i<带渗M;i++)
{
scanf("%d%d",&left,&right);
left-=1;
right-=1;
for(j=left;j<=right;j++)
if(j==left) {min=max=data[left];}
else
{
if(max if(min>春绝data[j]) min=data[j];
}
max=max-min;
totol[i]=max;
}
for(i=0;i printf("%d\n",totol[i]);
}

游客3

# include巧郑衫
# include
# define M 100
void findmax(int * a,int m1,int m2)
{
int i,j,k = 0,max,s[M];
//用双层for循环将所有输入的数据相互作丛纳差,并取绝对值
for(i = m1-1;i <= m2-1 ;i++)
for(j = m1-1;j <= m2-1;j++)
s[k++] = fabs(a[j] - a[i]);
//找出最大的差
max = s[0];
for(i = 0;i < k ;i++)
{
if(s[i] > max)
max = s[i];
}
printf("%d\n",max);
}
int main(void)
{
int i,j,m,n,m1,m2,a[M];
while(scanf("%d%d",&m,&n) != EOF)//可以连续孝腔测试多组数据,按crt + z作为结束标志
{
for(i = 0;i < m;i++)
scanf("%d",&a[i]);
for(j = 0;j < n;j++)
{
scanf("%d%d",&m1,&m2);
findmax(a,m1,m2);//找出最大的差值
}
}

return 0;
}

游客4

..不懂、、、、