这题的 SPJ 糟透了
查看原帖
这题的 SPJ 糟透了
40318
Acfboy楼主2021/6/9 21:33

也许没有那么严重,但绝对是一个不称职的 SPJ。

理由如下:

  1. 题目描述里

接下来 nn 行每行一个实数 aia_i 表一条边的长度。

SPJ 里却是:

	for(int i=1,a;i<=N;i++){
		a=inf.readInt();
		++La[a];
	}

他直接就读了个整数!

  1. 对两个距离的比较。这也是由前一个问题导致的,居然是用个 map 把所有整数出现的次数记了一下,然后和输出中的实数个数上取整比对?
dis=sqrt(dis);
if(dis-floor(dis)>1e3)
	quitf(_wa, "Wrong Answer %lf",dis);
int o=floor(dis+0.5);
if(La[o]==0)
	quitf(_wa, "Wrong Answer %d",o);
--La[o];
  1. 题目里根本没有要求逆序输出,但 checker 里直接就按两两之间的顺序求了长度,这样可能不是凸包边的长度啊!
ANS[N+1][0]=ANS[1][0];
ANS[N+1][1]=ANS[1][1];
for(int i=1;i<=N;i++){
	double dis=(ANS[i][0]-ANS[i+1][0])*(ANS[i][0]-ANS[i+1][0])
		+(ANS[i][1]-ANS[i+1][1])*(ANS[i][1]-ANS[i+1][1]);

调了一晚上,一直 WA,看了 SPJ 才发现这个样子,气死了!


我改了一下 SPJ, 加入了以下内容:

  1. 读入实数。
  2. 把所有的点按照以 以最左下点为参照的极角排序以避免长度不是凸包长度的问题。
  3. 把用 map 计数的比较方式改成排序后对应比较改成了排序后依次比较。因为实数精度问题 map 会出事。

我写的 SPJ 放在 这里, 第一次写 SPJ, 如果有问题请指出。

希望尽快修正 SPJ。

2021/6/9 21:33
加载中...