ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-09-19 ACM-ICPC亚洲区域赛网络赛(第一场)记实

2021-09-20 18:31:14  阅读:143  来源: 互联网

标签:刻晴 19 18 09 记实 long int 读入 ans


I题 Neiborhood Search(找邻居)

抛开那个坑点,这个题其实就是一道没学过竞赛的编程初学者都能做出来的题目,但是这个题我们队WA了20多发也没过。那么那个坑点是什么呢?不是题意描述有坑,也不是有什么特殊情况没想到,而是卡在了没法读入数据上。是的!连数据都读入不进去!原因是什么呢?

正式比赛的时候题面上也没有写,是比赛结束之后题面上才加了句:输入的每个数后面都附带一个空格!也就是说第一行输入的最后一个数后面也有一个空格!

这就导致了,我们用while循环每次读入一个数字加一个字符,判定读入结束的条件是字符变为回车。然而我们读入完最后一个数字加字符时,此时字符还是空格,因此判定读入还没有结束,将继续读入,可是此时我们默认了再读入的应该是数字,而实际读入的是回车!也就是说,最后我们将回车读入了数字里,将第二行的数字读入了字符里,此时程序才判定第一行读入结束!

实际比赛的时候,这个题一千五百多个队都过了,但是提交了一万三千多发,那么有没有什么AC的办法呢?一种方法是用python里自带的split函数来分割字符串,然而对于我们这些C++选手就束手无策了。其实,C++里面有一个sstream库,可以先用getline整体读入字符串,再使用一个stringstream类,利用数据流来消除空格。注意将字符串转换成数字时不能再用stringstream,因为这样就产生了两个流,会产生覆盖效果,就无法实现新流的输入。

题目大意

我们有一个一维不可重集S,给定一个目标点A,我们想找S中A的邻近点。考虑两个点是邻居,当且仅当它们在距离r之内。S中包含所有点的坐标,按照大小降序输出S中所有A的临近点的坐标。 ∣ S ∣ ≤ 100000 |S|≤100000 ∣S∣≤100000。

AC代码

#include<iostream>
#include<algorithm>
#include<sstream>
#define int long long
using namespace std;
long long f[100010], n = 0, u, d;
bool pd = 0;
int exchange(string s) {
	int ans = 0, f = 1;
	for (int i = s.size()-1; i >= 0; i--) {
		ans += (s[i] - '0')*f; f *= 10;
	}
	return ans;
}
signed main()
{
	int x, r;
	string s;
	stringstream ss;
	getline(cin, s);
	ss << s;
	int n = 0;
	while (ss >> s) {
		f[n++] = exchange(s);
	}
	cin >> x >> r;
	sort(f, f + n);
	int u = x + r, d = x - r;
	for (int i = n - 1; i >= 0; i--){
		if (f[i] >= d&&f[i] <= u) {
			cout << f[i] << " ";
			pd = 1;
		}
	}
	if (pd == 0) cout << endl;
	return 0;
}

F题 Land Overseer(大陆超视者)

这个题是我的锅。我坚信long long的数据范围是 [ − 1 0 18 , 1 0 18 ] [-10^{18},10^{18}] [−1018,1018],因此我就没用sqrt函数,而是用了三角函数。然而在面对如此大的数据时,三角函数产生的误差不可估量。对于弧度,只精确到六位是远远不够的。实际上,这个题直接用long long就可以,因为long long真正的数据范围是 [ − 9.223 × 1 0 18 , 9.223 × 1 0 18 ] [-9.223×10^{18},9.223×10^{18}] [−9.223×1018,9.223×1018],这样的话用sqrt函数就是可以的。对于这个题我只能说:基础不牢,山崩地裂。

题目大意(翻译)

作为璃月七星之一的玉衡星,刻晴管理着璃月的建设。
今天刻晴决定离开她的办公地去探访两个地方——深渊,绝云间。
刻晴的办公地和这两个地方的位置可以视为二维笛卡尔坐标系上的三个点。
刻晴的办公地,即起始位置,坐标 O ( 0 , 0 ) O(0,0) O(0,0)。
深渊位于坐标 A ( a , b ) A(a,b) A(a,b)处。
绝云间位于坐标 B ( 2 a , 0 ) B(2a,0) B(2a,0)处。
刻晴只需要探访到一个点所在的半径为R的邻域就算是探访成功。刻晴计划先访问深渊,再访问绝云间。
请你帮助刻晴找到探访深渊和绝云间的最短路径。
我们保证 0 < a , b , R < 1 0 9 , a 2 + b 2 > 4 R 2 , 0 < T ≤ 1000 0<a,b,R<10^9,a^2+b^2>4R^2,0<T≤1000 0<a,b,R<109,a2+b2>4R2,0<T≤1000。

AC代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	int T;
	cin >> T;
	int cnt = 0;
	while (T--) {
		int a, b, R;
		double ans;
		cin >> a >> b >> R;
		if (b > R) {
			ans = 2 * sqrt(a*a + (b - R)*(b - R)) - R;
		}
		else ans = 2 * a - R;
		cnt++;
		printf("Case #");
		cout << cnt;
		printf(": ");
		printf("%.2lf", ans);
		if (T > 0)cout << endl;
	}
    return 0;
}

总结

第一次打ICPC就爆零,毕竟实在想不到会被这两道题卡5个小时,还是卡在一些不可描述的地方。不愧是出CCCC的PTA,出个ICPC跟CCCC差不多,真就字符串模拟大赛了呗。想来也是经验不足,毕竟词典都忘带了,题意全靠猜。9月25号还有一场,这样的错误应该不会再犯了。
PS:感受到了被刻晴支配的恐惧!下次不会就轮到嘉心糖了吧!

标签:刻晴,19,18,09,记实,long,int,读入,ans
来源: https://blog.csdn.net/keguaiguai/article/details/120393044

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有