Pagini recente » Cod sursa (job #2574270) | Cod sursa (job #379192) | Cod sursa (job #948948) | Cod sursa (job #2067965) | Cod sursa (job #2377885)
#include <cstdio>
#include <algorithm>
#define DIMN 50100
using namespace std;
double a[DIMN],b[DIMN],k[DIMN],q[DIMN],s[DIMN];
int v[DIMN];
pair <int,int> vit[DIMN];
int main()
{
FILE *fin=fopen ("xmoto.in","r");
FILE *fout=fopen ("xmoto.out","w");
int n,l,i,sol=0;
double sa,sb,sk,sq,st,dr,mid,mid2;
fscanf (fin,"%d%d",&n,&l);
sa=sb=sk=sq=0.0;
for (i=1;i<=n;i++){
fscanf (fin,"%lf%lf%lf%lf%d",&a[i],&b[i],&k[i],&q[i],&v[i]);
vit[i]=make_pair(v[i],i);
sa+=a[i];
sk+=k[i];
}
vit[n+1]=make_pair(10000,n+1);
sort (vit,vit+n+2);
for (i=0;i<=n;i++){ /// ( vit[i] , vit[i+1] ]
if (vit[i].first==vit[i+1].first){
sa-=a[vit[i].second];
sb+=b[vit[i].second];
sk-=k[vit[i].second];
sq+=q[vit[i].second];
continue;
}
/// v * (sa + sb) +sk + sq = L
st=(vit[i].first+1)*1000000;
dr=(vit[i+1].first)*1000000;
while (st<=dr){
mid=(st+dr)/2;
mid2=1.0*mid/1000000;
if (mid2 *(sa+sb)+sk+sq==l)
break;
else if ((mid2 *(sa+sb)+sk+sq>l && sa+sb>0) || (mid2 *(sa+sb)+sk+sq<l && sa+sb<0))
dr=mid-1;
else st=mid+1;
}
if (st<=dr)
s[++sol]=mid;
sa-=a[vit[i].second];
sb+=b[vit[i].second];
sk-=k[vit[i].second];
sq+=q[vit[i].second];
}
fprintf (fout,"%d\n",sol);
for (i=1;i<=sol;i++)
fprintf (fout,"%.6lf ",s[i]);
return 0;
}