概述
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:感受到了被刻晴支配的恐惧!下次不会就轮到嘉心糖了吧!
最后
以上就是纯情汽车为你收集整理的2021-09-19 ACM-ICPC亚洲区域赛网络赛(第一场)记实的全部内容,希望文章能够帮你解决2021-09-19 ACM-ICPC亚洲区域赛网络赛(第一场)记实所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复