本文主要是介绍剪绳子set遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原题:登录—专业IT笔试面试备考平台_牛客网牛客网是互联网求职神器,C++、Java、前端、产品、运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://ac.nowcoder.com/acm/contest/30532/L题目:
Wiki是电视节目《超级大脑》的忠实粉丝,几乎每期必看。最近节目组发明了一个新的记忆游戏,Wiki积极报名,居然成功入选了!
新的游戏规则很简单,但需要选手有超强的数字记忆能力。主持人会取来一根十米长的绳子,将它水平粘在一块平板上,则此时这根绳子可以视为一根单位为米的坐标轴,左侧一端为0,右侧一端为10。然后每隔10秒种主持人会发布一条命令,命令分两种,"剪"和"答"。如果主持人命令"剪",现场工作人员会随机在绳子上任意剪一刀(但他当然不会去剪已经剪过的地方或者剪绳子的两端)。每次剪完后绳子依然像最初那样固定在平板上,只不过剪断的地方多了一道痕迹,并且绳子的段数增加了1。此时在平板上的测量仪器会对这一次剪断位置的坐标进行测量,并将该坐标显示在屏幕上,直到主持人喊出下一次命令才会消失。由于这台仪器十分精密,它的每次测量都会精确到小数点后五位。如果主持人喊出"答",则屏幕上会随机显示一个坐标(也是保留五位小数),要求Wiki在10秒内答出该坐标目前所在的一段绳子有多长。这里保证屏幕上的数字不会出现刚才剪断过的位置坐标。
输入:
第一行输入一个正整数q,表示主持人有q个命令。
接下来q行,每行输入一条命令。命令有两种格式:
1. C f:f是一个浮点数,且严格保留五位小数。该命令表示主持人要求现场工作人员剪绳子,并且屏幕上显示剪断位置的坐标为f;
2. A f:f是一个浮点数,且严格保留五位小数。该命令表示屏幕上显示了一个数f,要求Wiki回答出f所在的一段绳子长度为多少。这里要求"一段绳子"左右端点都是被剪断过的位置或者是初始绳子的左右端点之一(即坐标0.00000和10.00000的位置),且这一段绳子内部没有被剪断过的地方。
输出:
对于每个"答"的要求,要求输出屏幕显示的坐标所在的一段绳子的长度,保留五位小数。
代码
#include <bits/stdc++.h>
using namespace std;
set<float> p;
set<float>::iterator iter;
string z;
float a;
int n;
void find_set(float a)
{
bool bol = 0;
if(a == 10)
{
iter = p.end();
iter --;
iter --;
printf("%.5f\n",10 - *iter);
}
if(a == 0)
bol = 1;
for(iter = p.begin();iter != p.end();iter ++)
{
if(iter != p.begin() && bol)
{
printf("%.5f\n",*iter);
break;
}
if(*iter > a)
{
float b = *iter;
iter --;
printf("%.5f\n",b - *iter);
iter ++;
break;
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
p.insert(0); // 初始端点需要特判
p.insert(10.0);
cin >> n;
while(n --)
{
cin >> z >> a;
if(z[0] == 'C') // C 剪
p.insert(a);
else // A 询问
{
find_set(a);
}
}
return 0;
}
这篇关于剪绳子set遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!