Page 3 of 3
Double type rounding
Posted: Tue Sep 05, 2006 5:35 pm
by nano72
Hi guys,
I am writing some code to do normal rounding passing it in the value say 0.085 rounding it to .01 places where i should get 0.09. (note this only one example I may want to round it .001, etc )
Has anyone out there a neat way I could so this in c++.
Thanks in advance ,
nano72
Posted: Tue Sep 05, 2006 6:25 pm
by Abednego
If d is the number of digits you want to round to, do this:
Code: Select all
double x = 0.085;
double m = pow( 10.0, d );
x = (int)(x * m + 0.5) / m;
Note the doubles. Make sure you're not dividing integers by integers.
Posted: Tue Sep 05, 2006 7:09 pm
by nano72
Thanks for that

but checked it out and it doesn't do alot
My return value is 0.000000
where i would expect 0.09
the substituding is
double x = 0.085;
double m = pow( 10.0, 0.01);
x = (int)(0.085 * m + 0.5) / m;
Any ideas ..
Posted: Tue Sep 05, 2006 8:38 pm
by Abednego
change 0.01 to 2.
Posted: Wed Sep 06, 2006 11:13 am
by nano72
Hi Abednego,
Tried that substitude and it works for the .085 combination I now get .09 which is correct!
BUT for the .086 - i get .091 expect .09
for .081 - i get .86 expect .08
.08 get .085 where i expect to get .08 if rounding to nearest 0.01
Any ideas here ..
Thanks again !
Posted: Fri Sep 22, 2006 10:50 pm
by 898989
please, some help, this is the first time i write this type of binary search, can any one find the bug
Code: Select all
if(m != k && n != 0)
{
while(fabs(start-end) > EPS)
{
middle = (start+end)/2;
/* Build Bipartite graph using matching condition d<=middle */
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
cap[i][j] = 0;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
d = hypot(xg[i]-xh[j], yg[i]-yh[j]);
if(d <= middle) cap[i][j] = 1;
}
}
n_right_side = m; n_left_side = n;
max = Bipartite();
if(max >= m-k) end = middle;
else start = middle;
}
}
cout<<"Case #"<<l<<":\n";
if(m == k)
cout<<0<<"\n";
else if(n == 0)
cout<<"Too bad.\n";
else
cout<<middle+EPS<<"\n";
xg[], yg[] are the positions of gophers, xh[], yh[] are the positions of holes.
Assume Bipartite(); is a function that calc max bipartite matching
hypot(x, y) = sqrt(x*x+y*y);
intially start = 0;
end = largest distance between (xg
, yg[j]) for all i, j.
i try it once end = 1000000.. 
So many WA's in this prob
Posted: Mon Feb 05, 2007 11:00 pm
by shihabrc
I am doing bin search on distance and running mbm. I'm getting wa in this.
Code: Select all
#include <stdio.h>
#include <queue>
#include <vector>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define NIL -1
#define MAXN 110
typedef struct Point_
{
double x,y;
} Point_;
double maxDis;
int Match[MAXN];
int v,M,N;
double W[MAXN][MAXN];
bool visited[MAXN];
vector <int> adj[MAXN];
Point_ field[MAXN];
bool augment(int u)
{
int next;
if( u == -1 )
return true;
for( int i = 0; i < adj[u].size(); i++ )
{
next = adj[u][i];
if( !visited[next] )
{
visited[next] = true;
if(augment(Match[next]))
{
Match[next] = u;
return true;
}
}
}
return false;
}
int MBM(double w)
{
int i,match,j;
memset(Match,NIL,sizeof(Match));
for( i = 1; i <= M; i++ ) adj[i].clear();
for( i = 1; i <= M; i++ )
{
for( j = M + 1; j < N + M + 1; j++ )
{
if( W[i][j] <= w ) adj[i].push_back(j);
}
}
match = 0;
for( i = 1; i <= M; i++ )
{
memset(visited,false,sizeof(visited));
if( augment(i) )
match++;
}
return match;
}
void buildGraph()
{
int i,j;
v = N + M + 2;
maxDis = -1;
for( i = 1; i <= M; i++ )
{
for( j = M + 1; j < N + M + 1; j++ )
{
W[i][j] = sqrt((field[i].x - field[j].x) * (field[i].x - field[j].x) + (field[i].y - field[j].y) * (field[i].y - field[j].y) );
if( maxDis < W[i][j] )
maxDis = W[i][j];
}
}
}
int main()
{
int i,K,T,caseno,m;
double lo,hi,mid;
//freopen("C:\\4.txt","rb",stdin);
scanf("%d",&T);
for( caseno = 1; caseno <= T; caseno++ )
{
scanf("%d %d %d",&M,&N,&K);
for( i = 1; i <= M; i++ ) scanf("%lf %lf",&field[i].x,&field[i].y);
for( i = M + 1; i < M + N + 1; i++ ) scanf("%lf %lf",&field[i].x,&field[i].y);
printf("Case #%d:\n",caseno);
if( M == K )
{
printf("0\n\n");
continue;
}
buildGraph();
m = MBM(maxDis);
if( m < M - K )
{
printf("Too bad.\n\n");
continue;
}
lo = 0,hi = maxDis;
while( fabs(lo - hi) > 1e-7 )
{
mid = (lo + hi) / 2;
m = MBM(mid);
if( m >= M - K ) hi = mid;
else lo = mid;
}
double mm = 1000.0;
mid = (int)(mid * mm + 0.5) / mm;
printf("%.3lf\n\n",mid);
}
return 0;
}
Any suggetions,I/O.....
plz hlp.
Re: 10804 - Gopher Strategy
Posted: Fri Apr 03, 2009 12:11 pm
by fushar
how if m = 0 or n = 0? What should be output? Too bad or 0.000?
Also how if m = k?
Those are too tricky for me. I've getting WA too many times...
Any help wanted........
Re: 10804 - Gopher Strategy
Posted: Sat Apr 04, 2009 12:22 am
by mf
If m=0 or m=k or (n=0 and m=0), the answer is 0.000, of course.
Re: 10804 - Gopher Strategy
Posted: Sat Apr 04, 2009 3:00 pm
by fushar
Yeah, finally I managed to get AC
I just changed the binary search to work on the sorted distance array instead directly on distance.
Maybe previously I had floating point problems.
Anyway, thanx all for helping me...