一个疑问
查看原帖
一个疑问
585805
MCRS_lizi楼主2023/1/24 17:07

为什么我提前定义一个值 inf=RAND_MAX,然后之后使用 inf 就会挂,但是直接使用 RAND_MAX 就可以过?

AC code:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
#define double long double
using namespace std;
int n,cnt;
double t=2000,sx,sy,ansx,ansy,sum=1e18;
const double t0=1e-14,delta=0.993;
const int inf=RAND_MAX;
struct node
{
	int x,y,w;
}a[1010];
inline double f(register double x,register double y)
{
	register double res=0;
	for(register int i=1;i<=n;i++)
	{
		register double dx=x-a[i].x,dy=y-a[i].y;
		res+=sqrt(dx*dx+dy*dy)*a[i].w;
	}
//	cout<<res<<"\n";
	return res;
}
inline void cold()
{
	t=2000;
	register double x=ansx,y=ansy;
	while(t>t0)
	{
		register double nx=x+1.0*((rand()<<1)-RAND_MAX)*t,ny=y+1.0*((rand()<<1)-RAND_MAX)*t;
		register double now=f(nx,ny);
		register double d=now-sum;
		if(d<0)
		{
			x=nx,y=ny;
			ansx=nx,ansy=ny,sum=now;
	//		cout<<x<<" "<<y<<endl;
		}
		else if(exp(-d/t)*inf>rand())
		{
			x=nx,y=ny;
		}
		t*=delta;
	}
}
void solve()
{
	ansx=(double)sx/n,ansy=(double)sy/n,sum=f(ansx,ansy);
	while((double)clock()/CLOCKS_PER_SEC<=0.95)
//	for(int i=1;i<=5;i++)
	{
		cold();
	}
}
signed main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	srand(19260817);
	cin>>n;
	for(register int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].w;
		sx+=a[i].x,sy+=a[i].y;
	}
	solve();
	printf("%.3Lf %.3Lf\n",ansx,ansy);
 	return 0;
}

11pts WA code:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
#define double long double
using namespace std;
int n,cnt;
double t=2000,sx,sy,ansx,ansy,sum=1e18;
const double t0=1e-14,delta=0.993;
const int inf=RAND_MAX;
struct node
{
	int x,y,w;
}a[1010];
inline double f(register double x,register double y)
{
	register double res=0;
	for(register int i=1;i<=n;i++)
	{
		register double dx=x-a[i].x,dy=y-a[i].y;
		res+=sqrt(dx*dx+dy*dy)*a[i].w;
	}
//	cout<<res<<"\n";
	return res;
}
inline void cold()
{
	t=2000;
	register double x=ansx,y=ansy;
	while(t>t0)
	{
		register double nx=x+1.0*((rand()<<1)-inf)*t,ny=y+1.0*((rand()<<1)-inf)*t;
		register double now=f(nx,ny);
		register double d=now-sum;
		if(d<0)
		{
			x=nx,y=ny;
			ansx=nx,ansy=ny,sum=now;
	//		cout<<x<<" "<<y<<endl;
		}
		else if(exp(-d/t)*inf>rand())
		{
			x=nx,y=ny;
		}
		t*=delta;
	}
}
void solve()
{
	ansx=(double)sx/n,ansy=(double)sy/n,sum=f(ansx,ansy);
	while((double)clock()/CLOCKS_PER_SEC<=0.95)
//	for(int i=1;i<=5;i++)
	{
		cold();
	}
}
signed main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	srand(19260817);
	cin>>n;
	for(register int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].w;
		sx+=a[i].x,sy+=a[i].y;
	}
	solve();
	printf("%.3Lf %.3Lf\n",ansx,ansy);
 	return 0;
}

区别仅有 cold() 函数中定义 nx,ny 那一行。

2023/1/24 17:07
加载中...