| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
又是GCC提交wa,C提交ac,希望大牛帮忙看看,代码哪里有问题代码在http://hi.baidu.com/994026084/item/1fb2a7d1d9c9e254d73aae74
我感觉vc比gcc对越界访问容错性强,gcc的全局变量可能初始值不为零。但越界没检查出来,全局变量试过也不行,郁闷~~
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100
#define MAXM 100
#define INF 2147483647
typedef struct
{
int b;
int p;
}type;
type pair[MAXN+1][MAXM+1];
int m[MAXN+1],B,P,n;
int b[(MAXN*MAXM)+1];
double ans;
int cmptype(const void * a, const void * b)
{
return(*(type *)a).p-(*(type *)b).p;
}
int cmpint(const void * a, const void * b)
{
return(*(int *)a)-(*(int *)b);
}
int Bsearch(int l,int r,type a[],int b)
{
int mid;
while(l<=r)
{
mid=(r+l)/2;
if(b<a[mid].b)
r=mid-1;
else if(b>a[mid].b)
l=mid+1;
else return mid;
}
return l;
}
void dfs(int deep)
{
int i;
if(deep>=n)
{
//printf("%d %lf %d\n",deep,(double)B/P,P);
if(ans<(double)B/P)
ans=(double)B/P;
}
else
{
//for(i=1;i<=m[deep+1]&&pair[deep+1][i].b<B;i++);
i=Bsearch(1,m[deep+1],pair[deep+1],B);
if(P==0||ans<(double)B/P)
{
//printf("(%d,%d)",i,pair[deep+1][i].p);
P+=pair[deep+1][i].p;
dfs(deep+1);
P-=pair[deep+1][i].p;
}
}
}
int main()
{
int i,j,k,t,c,min,max;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1,min=INF,c=1;i<=n;i++)
{
scanf("%d",m+i);
for(j=1;j<=m[i];j++)
scanf("%d%d",&(pair[i][j].b),&(pair[i][j].p));
qsort(pair[i]+1,m[i],sizeof(pair[i][0]),cmptype);
for(j=2,k=2;j<=m[i];j++)
{
if(pair[i][j].b>pair[i][k-1].b)
{
pair[i][k]=pair[i][j];
k++;
}
}//取重
m[i]=k-1;
for(j=m[i]-1,k=m[i]-1;j>=1;j--)
{
if(pair[i][j].p!=pair[i][j+1].p)
{
pair[i][k]=pair[i][j];
k--;
}
}
m[i]-=k;
for(j=1;j<=m[i];j++)
pair[i][j]=pair[i][k+j];//取重
for(j=1,max=0;j<=m[i];j++)
{
//printf("(%d %d) ",pair[i][j].b,pair[i][j].p);
b[c]=pair[i][j].b;
if(max<pair[i][j].b)
max=pair[i][j].b;
c++;
}
if(min>max)
min=max;
//printf("\n");
}
qsort(b+1,c-1,sizeof(b[0]),cmpint);
//printf("%d b:",c-1);
//for(i=1;i<c;i++)printf("%d ",b[i]);
//printf("\nmin:%d\n",min);
ans=0;
B=b[1];
//printf("%d\n",P);
dfs(0);//对设备最小带宽小于B进行搜索
for(i=2;b[i]<=min;i++)
{
if(b[i]!=b[i-1])
{
B=b[i];
dfs(0);//对设备最小带宽小于B进行搜索
}
}
printf("%.3lf\n",ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator