讨论 / 对ski lift 表示无奈
sideman 2010-06-29 03:54:00
点我顶贴 收藏 删除
不带的啊 double能过,我用分数,结果70

#include<iostream>

#define maxlongint 0x7fffffff

#include<cstdio>

using namespace std;

int ggcd(int a,int b)

{

if(b!=0) return ggcd(b,a%b);

else return a;

}

int gcd(int a,int b)

{

a=max(a,-a);

b=max(b,-b);

return ggcd(a,b);

}

struct fs

{

int son,mot;

bool operator >= (const fs lat)const

{

int g=gcd(mot,lat.mot);

__int64 th=son*(lat.mot/g);

__int64 tt=lat.son*(mot/g);

if(th>=tt) return true;

else return false;

}

void ass(int ts,int tm)

{

int tmp=gcd(ts,tm);

son=ts/tmp;

mot=tm/tmp;

}

};

int main()

{

int n,k;

int h[5200];

int i,j;

int f[5200]={0};

scanf("%d%d",&n,&k);

for(i=1;i<=n;i++) scanf("%d",&h[i]);

for(i=1;i<=n;i++) f[i]=maxlongint;

f[1]=1;

for(i=2;i<=n;i++)

{

fs now={-maxlongint,1};

for(j=i-1;j>=max(i-k,1);j--)

{

int dis=i-j;

fs tmp; tmp.ass(h[j]-h[i],dis);

if(tmp>=now)

{ f[i]<?=f[j]+1;now=tmp;

}

}

}

printf("%d",f[n]);

return 0;

}

改成double 效果明显

int main()

{

int n,k;

int h[5200];

int i,j;

int f[5200]={0};

scanf("%d%d",&n,&k);

for(i=1;i<=n;i++) scanf("%d",&h[i]);

for(i=1;i<=n;i++) f[i]=maxlongint;

f[1]=1;

for(i=2;i<=n;i++)

{

double now=-maxlongint;

for(j=i-1;j>=max(i-k,1);j--)

{

int dis=i-j;

double tmp=(double)(h[j]-h[i])/(double)dis;

if(tmp>=now)

{ f[i]<?=f[j]+1;now=tmp;

}

}

}

//for(i=1;i<=n;i++) cout<<f[i]<<' ';

printf("%d",f[n]);

getchar();

getchar();

return 0;

}

ac了

查看更多回复
提交回复