codeforces 567D One-Dimensional Battle Ships (set)

来源:互联网 发布:手机转区软件 编辑:程序博客网 时间:2024/05/22 11:52
/*题意:在1~n的格子里,有k艘,每艘长为a的船,并且这些船不相交且不能相邻。现在有m个射击,每个射击给你一个位置(1~n),并且不会重复。由于对方每次都说没打中,因此你想找到至少要射击几次才能证明对方说谎。若不能证明对方说谎,输出-1。思路:n个格子,船长为a,则能放(n+1)/(a+1)艘船。(由于要求不能相邻,因此a+1)。每次在set中插入射击点,二分上下界 原来可以放的船数减去因这个点而不能放的与k进行比较*/# include<stdio.h># include<algorithm># include<string.h># include<set>using namespace std;set<int>s;set<int>::iterator it1;set<int>::iterator it2;int vis[200010];int num[200010];int main(){    int n,k,a,i,m;    while(~scanf("%d%d%d",&n,&k,&a))    {        s.clear();        scanf("%d",&m);        for(i=1; i<=m; i++)            scanf("%d",&num[i]);        int tmp=(n+1)/(a+1);///原来可以放这么多        s.insert(0);//上下边界        s.insert(n+1);        memset(vis,0,sizeof(vis));        for(i=1; i<=m; i++)        {            if(vis[num[i]])                continue;            vis[num[i]]=1;            s.insert(num[i]);            it1=s.lower_bound(num[i]);            it1--;            it2=s.upper_bound(num[i]);            tmp-=((*it2)-(*it1))/(a+1)-((*it2)-num[i])/(a+1)-(num[i]-(*it1))/(a+1);            if(tmp<k)            {                printf("%d\n",i);                break;            }            //  printf("%d %d\n",*it1,*it2);        }        if(i>m)            printf("-1\n");    }    return 0;}

0 0
原创粉丝点击