讨论 / 请高手看看为什么总进死循环
yangchen 2011-02-22 04:04:00
点我顶贴 收藏 删除
是不是我的思路有问题?

#include<iostream>

using namespace std;

int main()

{

double a[51],b[51],xy,rt=0,zt=0,nt;

int n,i,j,x,d;

cin >>n;

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

cin >>a[i];

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

cin >>b[i];

cin >>xy;

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

{

a[i]=b[i]*(a[i]/100);

rt+=a[i];

zt+=b[i];

}

for(i=1;i<=n-1;i++)

for(j=i+1;j<=n;j++)

if(a[j]/b[j]<a[i]/b[i])

{

swap(a[i],a[j]);

swap(b[i],b[j]);

}

x=1;

d=n;

nt=rt/zt;

nt*=100;

while(nt!=xy)

{

if(nt>xy)

{

zt-=b[d];

rt-=a[d];

nt=rt/zt;

nt*=100;

d--;

continue;

}

if(nt<xy)

{

zt-=b[x];

rt-=a[x];

nt=rt/zt;

nt*=100;

x++;

continue;

}

}

printf("%.5f\n",zt);

return 0;

}

#1 dawning@2011-02-22 04:04:00
回复 删除
思路:全部倒在一起,太浓了就从最浓的开始倒出来,太稀了就从最稀的开始倒出来。

#include<stdio.h>

#include<stdlib.h>

int cmp(const void *a,const void *b)

{

return *(int *)b-*(int *)a;

}

int main()

{

int i,n,a[100][2],y;

double m=0.0f,v=0.0f,result=0.0f,x;

scanf("%d",&n);

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

scanf("%d",&a[i][0]);

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

scanf("%d",&a[i][1]);

scanf("%d",&y);

qsort(a,n,sizeof(int)*2,cmp);

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

{

m+=a[i][0]*a[i][1];

v+=a[i][1];

}

if(m/v==y)result=v;

if(m/v>y)

{

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

{

x=(m-v*y)/(a[i][0]-y);

if(x<=a[i][1]){result=v-x;break;}

else

{

m-=a[i][0]*a[i][1];

v-=a[i][1];

}

}

}

else if(m/v<y)

{

for(i=n-1;i>=0;i--)

{

x=(m-v*y)/(a[i][0]-y);

if(x<=a[i][1]){result=v-x;break;}

else

{

m-=a[i][0]*a[i][1];

v-=a[i][1];

}

}

}

printf("%.5lf\n",result);

return 0;

}

查看更多回复
提交回复