一维战舰(51Nod-1521)

题目

爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格)。

在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博。每一只战舰的形状是 1×a 的长方形(也就是说,战舰会占据a个连续的方格)。这些战舰不能相互重叠,也不能相接触。

然后鲍博会做一系列的点名。当他点到某个格子的时候,爱丽丝会告诉他那个格子是否被某只战舰占据。如果是,就说hit,否则就说miss。

但是这儿有一个问题!爱丽丝喜欢撒谎。他每次都会告诉鲍博miss。

请你帮助鲍博证明爱丽丝撒谎了,请找出哪一步之后爱丽丝肯定撒谎了。

输入

单组测试数据。
第一行有三个整数n,k和a(1≤n,k,a≤2*10^5),表示表格的大小,战舰的数目,还有战舰的大小。输入的n,k,a保证是能够在1×n的表格中放入k只大小为a的战舰,并且他们之间不重叠也不接触。
第二行是一个整数m(1≤m≤n),表示鲍博的点名次数。
第三行有m个不同的整数x1,x2,...,xm,xi是鲍博第i次点名的格子编号。格子从左到右按照1到n编号。

输出

输出一个整数,表示最早一次能够证明爱丽丝一定撒谎的点名编号。如果不能证明,输出-1。点名的编号依次从1到m编号。

输入样例

样例1
11 3 3
5
4 8 6 1 11

样例2
5 1 3
2
1 5

输出样例

样例1
3

样例2
-1

思路:桶排+模拟

利用桶排的思维,对给出的不能放置的点进行统计,然后统计当前能放的战舰个数并与应该能放的个数进行比较,如果小于,说明撒谎,输出位置即可

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000000+5;
const int dx[] = {-1,1,0,0};
const int dy[] = {0,0,-1,1};
using namespace std;
bool bucket[N];
int main() {
    int n,k,a,m;
    scanf("%d%d%d%d",&n,&k,&a,&m);

    bool flag=false;
    int num=(n+1)/(a+1);//最多放的数量
    for(int i=1;i<=m;i++){
        int x;
        scanf("%d",&x);
        bucket[x]=true;

        if(!flag){
            int left=x-1,right=x+1;
            while(left>=0&!bucket[left])//x左端的空余
                left--;
            while(right<=n&&!bucket[right])//x右端的空余
                right++;

            num=num-(right-left)/(a+1);//减去x左端空余到x右端空余不能放的数量
            num=num+(x-left)/(a+1)+(right-x)/(a+1);//加上x左右两端空余应该能放的数量
            if(num<k){//如果小于最多放的数量,说明欺骗
                printf("%d\n",i);
                flag=true;
            }
        }
    }
    if(!flag)
        printf("-1\n");
    return 0;
}

 

posted @   老程序员111  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示