Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

runtime error问题,一直没解决,请大神帮忙看看。

Posted by haining at 2012-07-12 17:22:16 on Problem 1873
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double zero=0.000001;
int stack[20];

double sum;
int top;
struct point{
  double x,y;
  int vi,li;
  };
point p[20],temp[20];

double dis(point p1,point p2)
{
  return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double mult(point p1,point p2,point p0)
{
  return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}

int cmp(const point &p1,const point &p2)
{ if(mult(p1,p2,p[0])>0)return 1;
  else if(fabs(mult(p1,p2,p[0]))<zero&&(dis(p1,p[0])<dis(p2,p[0])))return 1;
  else return 0;
}

void gransan(point p1[],int n1)
{   
  if(n1==1)
  { stack[0]=0;
  top=0;
  }
  if(n1==2)
  { stack[0]=0;
  stack[1]=1;
  top=1;
  }
  if(n1>2)
  {
  int low=0;
    
  for(int i=0;i<n1;i++)
  { if(p1[i].y<p1[low].y)
  low=i;
  else if((p1[i].y==p1[low].y)&&(p1[i].x<p1[low].x))
  low=i;
  }
  point temp1;
  temp1=p1[low];
  p1[low]=p1[0];
  p1[0]=p1[low];
    
  sort(p1+1,p1+n1,cmp);
  stack[0]=0;
  stack[1]=1;
  top=1;
  for(int i=2;i<n1;i++)
  {
  if((mult(p1[i],p1[stack[top]],p1[stack[top-1]])<0)||fabs(mult(p1[i],p1[stack[top]],p1[stack[top-1]]))<zero)
  { top++;
  stack[top]=i;
  }
  else{
  do{
  top--;
  }while(mult(p1[i],p1[stack[top]],p1[stack[top-1]])>0);
  top++;
  stack[top]=i;
  }
  }
  }
}
    
int main()
{ int n,u,e;
  int sumvi,sumli,num;
  int sign[20],sign1[20];
  int minvi,min;
  double extra;
  int cases;
  cases=0;
  while(scanf("%d",&n)&&n)
  {  
  minvi=9999999;
  cases++;
  for(int i=0;i<n;i++)
  scanf("%lf%lf%d%d",&p[i].x,&p[i].y,&p[i].vi,&p[i].li);
  for(int i=0;i<1<<n;i++)
  {
  u=i;
  sumvi=0;
  sumli=0;
  num=0;
  memset(sign,0,sizeof(sign));
  for(int j=0;j<n;j++)
  {
  if(u&1)
  {
  sumvi+=p[j].vi;
  sumli+=p[j].li;
  sign[j]=1;
  }
  else
  {
  temp[num]=p[j];
  num++;
  }
  u>>=1;
  }
    
  /* for(int i=0;i<n;i++)
  {
  if(sign[i]==1)
  {
  printf(" %d\n",i);
  }
  }
  printf("sumvi:%d minvi:%d\n",sumvi,minvi);*/  
    
  if(sumvi>minvi)continue;
    
  /* for(int k=0;k<num;k++)
  printf("凸包 x:%lf y:%lf\n",temp[k].x,temp[k].y); */  
    
    
  gransan(temp,num);
  /* printf("top %d\n",top);
  for(int k=0;k<=top;k++)
  printf("stack %d\n",stack[k]);*/  
  sum=0;
  for(int i=0;i<top;i++)
  {  
  sum+=dis(temp[stack[i]],temp[stack[i+1]]);
  // printf("dis %lf\n",dis(temp[stack[i]],temp[stack[i+1]]));
  }
  sum+=dis(temp[stack[top]],temp[stack[0]]);
  // printf("dis %lf\n",dis(temp[stack[top]],temp[stack[0]]));
    
  if(sum<=sumli)
  {
  if((sumvi<minvi)||((sumvi==minvi)&&(n-num<min)))
  {  
  extra=(double)sumli-sum;
  min=n-num;
  minvi=sumvi;
  e=0;  
  for(int k=0;k<n;k++)
  {
  if(sign[k]==1)
  {  
  sign1[e++]=k;  
  // printf("k:%d\n",k+1);  
  }
    
  }
  }  
  }
  }  
  printf("Forest %d\n",cases);
  printf("Cut these trees:");
  for(int i=0;i<e;i++)
  { sign1[i]++;   
  printf(" %d",sign1[i]);
  }
  printf("\n");
  printf("Extra wood: %.2lf\n",extra);
  }
  system("pause");
  return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator