当前位置: 代码迷 >> C语言 >> 这个题目该怎么做.翻译一下.
  详细解决方案

这个题目该怎么做.翻译一下.

热度:226   发布时间:2006-10-27 17:30:53.0

/*赋上自己写的,大家帮着看一下,看哪里不符题意*/

#include<stdio.h>
#include<math.h>
typedef struct {
long data;
int flag;
}Blink;

Blink a[1000];
int Find_Min(Blink *a,int n,long m) //返回求的最小值
{
int k,i=0;
long t,min;
while(i<n&&a[i].flag==1)
{
i++;
}
//printf("%d\n",i);
if(a[i].data>m)
{
min=a[i].data-m;
}
else
{
min=m-a[i].data;
}
k=i;
i++;
while(i<n)
{
if(a[i].flag==0)
{
if(m>a[i].data)
{
t=m-a[i].data;
}
else
{
t=a[i].data-m;
}
if(min>t)
{
min=t;
k=i;
}
}
i++;
}
return(k);
}

long Sum(Blink *a,int n,long l)
{
long sum=0,num,t=0;
int i=0,k;
num=l;
while(i<n)
{
k=Find_Min(a,n,num);
a[k].flag=1;
//printf("%d :",k);
if(num>a[k].data)
{
t+=num-a[k].data;
}
else
{
t+=a[k].data-num;
}
//printf("%ld\n",t);
sum+=t;
num=a[k].data;
i++;
}
return(sum);
}

int main()
{
int i,n;
long l;
scanf("%d%ld",&n,&l);
for(i=0;i<n;i++)
{
scanf("%ld",&a[i].data);
a[i].flag=0;
}
printf("%ld\n",Sum(a,n,l));
return(0);
}


----------------解决方案--------------------------------------------------------

给你组数据:
5 30
4 21 28 35 36
你得到的答案是114.
但事实上还有更优的.
30->35->36->28->21->4
5+6+14+21+38=84
你可以说一下你的算法,
不过偶觉得这道题还是需要用动态规划解


----------------解决方案--------------------------------------------------------

没看懂

4 10
1
9
11
19


10->9->11->19->1
1+3+11+29=44

为什么不是1+2+8+18呢


----------------解决方案--------------------------------------------------------
以下是引用cwande在2006-10-27 19:08:46的发言:

给你组数据:
5 30
4 21 28 35 36
你得到的答案是114.
但事实上还有更优的.
30->35->36->28->21->4
5+6+14+21+38=84
你可以说一下你的算法,
不过偶觉得这道题还是需要用动态规划解

我也觉得.我用贪心算法.每次选定离当前位置的最小距离.直到每个地方都遍历过.
动态规划刚学,还没理解好.
能不能给个代码?
----------------解决方案--------------------------------------------------------
以下是引用我不是郭靖在2006-10-27 19:31:41的发言:

没看懂

4 10
1
9
11
19


10->9->11->19->1
1+3+11+29=44

为什么不是1+2+8+18呢

如果你看懂题目的话就知道了.我们说的陈年旧草是指从贝西开始走动到吃完这块草地所需的时间。


----------------解决方案--------------------------------------------------------

  相关解决方案