10060 - A hole to catch a man

All about problems in Volume 100. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

Diablos
New poster
Posts: 5
Joined: Thu Oct 05, 2006 4:58 pm
Location: Egypt
Contact:

10060 - please help

Post by Diablos » Fri Oct 27, 2006 8:36 pm

Please heeeelp, I am trying to solve 10060 a hole to catch a man, and it gives me TLE :S :S :S

I tried to compare the last point with the first point with a very small error Epsilon ( I put 0.0000000000000001 ), and it was then giving WA :S :S :S

please help :S

Code: Select all

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <stdio.h>
#include <climits>
using namespace std;

#ifndef ONLINE_JUDGE
	#include <fstream>
	#define cin in
	ifstream in("10060.in");
#endif

struct point
{
	double  x, y;
	point(){}
	point(double  X, double  Y) : x(X), y(Y) {}
};



int main()
{
	double TotalMass, pi=2*acos(0.0);
	int nPloygon,Thikness;

	cin >> nPloygon;
	while( nPloygon != 0 && cin.good() )
	{
		TotalMass = 0;
		int i;

		for(i=0; i<nPloygon; i++)
		{
			cin>>Thikness;
		
			double A = 0;
			point p0,p_prev, p_curr(INT_MAX,INT_MAX);

			cin>>p0.x>>p0.y;
			p_prev = p0;

			while( p_curr.x != p0.x || p_curr.y != p0.y)
			{
				cin>>p_curr.x>>p_curr.y;
				A +=  p_prev.x * p_curr.y - p_curr.x * p_prev.y;
				p_prev = p_curr ;
			}
			
			TotalMass += fabs( A/2*Thikness );
			
		}
		double R,T;
		cin>>R>>T;

		cout<< (int)(  TotalMass/ ( R*R*T*pi )  )<<endl;
		
		cin >> nPloygon;
	}
	return 0;
}
Mustafa M. Mohie,
Ain Shams University
Faculty of Computer and Information Sciences
http://doomdiablos.spaces.live.com
http://doomdiablos.blogspot.com

abhineet.bansal
New poster
Posts: 2
Joined: Fri Jul 20, 2007 3:07 pm

Getting WA pls help...

Post by abhineet.bansal » Fri Dec 14, 2007 1:40 pm

hey guys pls try to solve my problem... i m getting WA ...
i use this formula...

Code: Select all

 Volume1 = sum over all polygons(thickness * 0.5 * (sum over 0<=i<=n-1(mod(xi * y(i+1) - (x(i+1)*y(i)))))
 Volume2 = 22.0/7.0 * r*r*t

 Result = (int)Volume1/Volume2;

pls tell me my mistake...
here is my JAVA code...

Code: Select all

import java.util.*;
import java.io.*;
class Main
{
  public static void main(String args[]) throws IOException
  {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    while(true)
    {
      int n=Integer.parseInt(br.readLine().trim());
      if(n==0) break;
      double volume=0.0;
      for(int i=0;i<n;i++)
      {
        String inp=br.readLine().trim();
        String arr[]=new String[9000];
        arr=inp.split("\\s+");
        double x1,y1;
        x1=Double.parseDouble(arr[1]);
        y1=Double.parseDouble(arr[2]);
        int k=3;
        double area=0.0;
        while(true)
        {
          double x2,y2;
          x2=Double.parseDouble(arr[k]);
          y2=Double.parseDouble(arr[k+1]);
          area+=(0.5)*((x1*y2)-(x2*y1));
          x1=x2;
          y1=y2;
          if(x1==Double.parseDouble(arr[1]) && y1==Double.parseDouble(arr[2])) break;
          k+=2;
        }
        if(area<0) area*=-1.0;
        volume+=area*(Double.parseDouble(arr[0]));
      }
      String arr[]=new String[2];
      arr=br.readLine().trim().split("\\s+");
      double volume2=22.0*(Double.parseDouble(arr[0]))*(Double.parseDouble(arr[0]))*(Double.parseDouble(arr[1]))/7.0;
      volume/=volume2;
      int ans=(int)volume;
      System.out.println(ans);
    }
  }
}


User avatar
kbr_iut
Experienced poster
Posts: 103
Joined: Tue Mar 25, 2008 11:00 pm
Location: IUT-OIC, DHAKA, BANGLADESH
Contact:

Re: 10060 A Hole to Catch a Man WA

Post by kbr_iut » Fri May 02, 2008 10:00 pm

I used the formula found in the board,, I am getting wrong answer. I need some tricky i/o anyone pliz help me
here is my code.

Code: Select all

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define max 10000

int main(){
	int n,k,flag,N,i,j;
	double sum1,h,x[max],r,y[max],sum,area,pi;
	pi=2*acos(0.0);
	char s[max]="",tem[max]="";
	//freopen("10060.txt","r",stdin);
	while(scanf("%d",&N)==1&&N){
		sum=0.0;
		for(n=0;n<N;n++){
			scanf("%lf",&h);
			gets(s);
			i=0;j=0;
			flag=1;
			while(s[i]!=NULL){
				while(s[i]==' '&&s[i]!=NULL)i++;
				k=0;
				while(s[i]!=' '&&s[i]!=NULL){
					tem[k++]=s[i++];
				}
				tem[k]=NULL;
				if(flag){x[j]=atof(tem);flag=0;}
				else {y[j++]=atof(tem);flag=1;}
				i++;
			}
			sum1=0.0;
			for(i=0;i<j-1;i++){
				sum1+=x[i]*y[i+1]-y[i]*x[i+1];
			}
			sum+=fabs(sum1*.5*h);
		}
		scanf("%lf %lf",&r,&h);
		area=1.0*pi*r*r*h;
		printf("%.0lf\n", floor(sum/area+.5));
	}
	return 0;
}
			





It is tough to become a good programmer.
It is more tough to become a good person.
I am trying both...............................

User avatar
linux
Learning poster
Posts: 56
Joined: Sat Jul 01, 2006 12:21 pm
Location: CA-95054
Contact:

Re: 10060 - A Hole to Catch a Man

Post by linux » Mon Aug 24, 2009 9:37 am

I am getting TLE!!

Code: Select all

#include <cstdio>
#include <cmath>
using namespace std;

int main () {
	int N, i, nP, res;
	double thick, x[2000], y[2000], area, sheetVol, manholeVol, mrad, mth;
	
	while (scanf("%d", &N) && N) {
		sheetVol = 0.0;
		while (N--) {
			nP = 0;
			scanf("%lf", &thick);
			scanf("%lf %lf", &x[nP], &y[nP++]);
			
			while (true) {
				scanf("%lf %lf", &x[nP], &y[nP]);
				if (x[nP] == x[0] && y[nP] == y[0]) {
					break;
				}
				nP++;
			}
			area = 0.0;
			for (i=2; i<nP; i++) {
				area += ((x[0] * y[i-1] + x[i-1] * y[i] + x[i] * y[0]) - (y[0] * x[i-1] + y[i-1] * x[i] + y[i] * x[0]));
			}
			sheetVol += area * thick;
		}
		scanf("%lf %lf", &mrad, &mth);
		manholeVol = 2 * acos(0.0) * mrad * mrad * mth;
		sheetVol = fabs(sheetVol) * .5;
		res = (int)(sheetVol / manholeVol);
		printf("%d\n", res);
	}
	
	return 0;
}

Solving for fun..

mak(cse_DU)
Learning poster
Posts: 72
Joined: Tue May 30, 2006 5:57 pm
Location: bangladesh

Re: 10060 - A Hole to Catch a Man

Post by mak(cse_DU) » Wed Aug 26, 2009 10:42 am

linux wrote:I am getting TLE!!

Code: Select all

#include <cstdio>
#include <cmath>
using namespace std;

int main () {
	int N, i, nP, res;
	double thick, x[2000], y[2000], area, sheetVol, manholeVol, mrad, mth;
	
	while (scanf("%d", &N) && N) {
		sheetVol = 0.0;
		while (N--) {
			nP = 0;
			scanf("%lf", &thick);
			scanf("%lf %lf", &x[nP], &y[nP++]);
			
			while (true) {
				scanf("%lf %lf", &x[nP], &y[nP]);
				if (x[nP] == x[0] && y[nP] == y[0]) {
					break;
				}
				nP++;
			}
			area = 0.0;
			for (i=2; i<nP; i++) {
				area += ((x[0] * y[i-1] + x[i-1] * y[i] + x[i] * y[0]) - (y[0] * x[i-1] + y[i-1] * x[i] + y[i] * x[0]));
			}
			sheetVol += area * thick;
		}
		scanf("%lf %lf", &mrad, &mth);
		manholeVol = 2 * acos(0.0) * mrad * mrad * mth;
		sheetVol = fabs(sheetVol) * .5;
		res = (int)(sheetVol / manholeVol);
		printf("%d\n", res);
	}
	
	return 0;
}

See if (x[nP] == x[0] && y[nP] == y[0])

replace it by if( fabs(x[nP]-x[0])<EPS && fabs(y[nP]-y[0])<EPS).
Then you will not get TLE
Mak
Help me PLZ!!

User avatar
linux
Learning poster
Posts: 56
Joined: Sat Jul 01, 2006 12:21 pm
Location: CA-95054
Contact:

Re: 10060 - A Hole to Catch a Man

Post by linux » Wed Aug 26, 2009 11:09 am

Thanks MAK. It's AC after modifications.. :)
Solving for fun..

evernon
New poster
Posts: 1
Joined: Wed Mar 14, 2012 10:21 am

Re: 10060 - A Hole to Catch a Man

Post by evernon » Wed Mar 14, 2012 10:38 am

Hi-

I am getting TLE :(. I have tried all fixes suggested here and it appears to work locally. Help is much appreciated ^^ :D.

Code: Select all

#include <stdio.h>
#include <math.h>
#include <float.h>

int main(int argc, char ** argv)
{


	while (1)
	{
		int num;
		scanf("%d", &num);
		if (num == 0) break;
		double volume = 0;
		int i;
		for (i = 0; i < num; i++)
		{
			int thickness;
			scanf("%d", &thickness);
			int x[20000];
			int y[20000];
			int x0; int y0;
			scanf("%d", &x0);
			scanf("%d", &y0);
			x[0] = x0;
			y[0] = y0;
			int j = 1;
			while (1)
			{
				int xn;
				int yn;
				scanf("%d", &xn);
				scanf("%d", &yn);
				if (fabs(x0 - xn) < FLT_EPSILON && fabs(y0 - yn) < FLT_EPSILON) break;
				x[j] = xn;
				y[j] = yn;
				j++;
			}
			double area = 0;
			int v;
			for (v = 0; v < j; v++)
			{
				area += x[v - 1] * y[v];
				area -= x[v] * y[v - 1];
			}
			area += x[v] * y[0];
			area -= x[0] * y[v];
			area /= 2.0;
			area = fabs(area);
			volume += area * thickness;
		}
		int radius; int thickness;
		scanf("%d", &radius);
		scanf("%d", &thickness);
		double circleVolume = 3.1415926535 * radius * radius * thickness;
		int amount = floor(volume / circleVolume);
		printf("%d\n", amount);
	}

	return 0;
}

brianfry713
Guru
Posts: 5947
Joined: Thu Sep 01, 2011 9:09 am
Location: San Jose, CA, USA

Re: 10060 - A Hole to Catch a Man

Post by brianfry713 » Thu Mar 15, 2012 11:17 pm

I think the input doesn't really have a zero at the end.

replace
scanf("%d", &num);
with
if(scanf("%d", &num)!=1) return 0;
Check input and AC output for thousands of problems on uDebug!

Post Reply

Return to “Volume 100 (10000-10099)”