FZU2203--比赛--10.1训练赛

本文介绍了一种使用C++实现的炮击模拟算法,通过动态调整船队布局来应对连续炮击,确保船队数量不低于预定阈值。利用set数据结构高效处理区间分割问题。

题目意思:很好理解

思路:

 当来一发炮弹时,把区间分割,看当炮弹打来后能容下多少的船,

  num 是 炮弹打来前能容纳的船的数目

  求出炮弹打到的区间的能容纳的船的个数,s1

  再求出炮弹打过来,分割的两个区间能容纳船的数目 s2

那莫现在的可容纳的船的数目 是num-s1+s2,然后和k比较

PS:

 要想找到炮弹打到位置的前驱和后继,要用到set,set是有序的插入和删除的时间复杂度低,去寻找前驱后继简单

  要事先存入0和n+1,范围,然后把船的宽度加1,因为两艘船的之间要相聚1个位置

CODE

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set>
#define maxn 200010
using namespace std;
set<int>::iterator it1,it2;
int ls[maxn];
int main()
{
    int n, k, a;
    while(~scanf("%d%d%d",&n,&k,&a))
    {
        int i, j;
        int m;
        a++;
        scanf("%d",&m);
        for(i = 0; i < m; i++)
        {
            scanf("%d",&ls[i]);
        }
        set<int> A;
        A.insert(0);
        A.insert(n+1);
        int num = (n+1)/a;
        for(i = 0; i < m; i++)
        {
            it1 = A.upper_bound(ls[i]);
            it2 = it1--;
            A.insert(ls[i]);
            num -= (*it2 - *it1)/a;
            num +=(*it2 - ls[i])/a;
            num +=(ls[i] - *it1)/a;
            if(num < k)
            {
                printf("%d\n",i+1);
                break;
            }
        }
        if(i >= m)
        {
            printf("-1\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值