剪绳子set遍历

原题:登录—专业IT笔试面试备考平台_牛客网牛客网是互联网求职神器,C++、Java、前端、产品、运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力icon-default.png?t=M276https://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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值