洛谷 B3974 [语言月赛 202405] 放行李

题面

题目描述

小 S 推着她的行李箱走上高铁,开启了一段精彩的旅行。

这节车厢的行李架分为左右两列,每一列分别有 n n n 个位置,从前往后按 1 1 1 n n n 依次编号。对于任意两个编号为 i i i j j j 的位置(不区分是哪一列),它们之间的距离是 ∣ i − j ∣ \vert i - j \vert ij

∣ x ∣ \vert x \vert x 代表 x x x 的绝对值。当 x ≥ 0 x \geq 0 x0 ∣ x ∣ = x \vert x \vert = x x=x;当 x < 0 x < 0 x<0 ∣ x ∣ = − x \vert x \vert = -x x=x

0 0 0 表示行李架左边一列,用 1 1 1 来表示右边一列。小 S 的座位在 p p p 列的编号 q q q 的位置处( p = 0 p = 0 p=0 1 1 1 1 ≤ q ≤ n 1 \leq q \leq n 1qn)。

现在小 S 想要在某个位置摆放她的行李箱。然而,已经有一些位置被其它行李占用,所以那些位置是不能摆放行李箱的。小 S 只能选择一个没有行李的空位。

在此基础上,小 S 首先希望行李箱的摆放位置距离她尽可能小。其次,如果有两个不同列的空位置和她的位置距离最小且相同,那么小 S 会选择和她在同一列的那一个位置。

现在给你左右两列的行李摆放情况,请你找到一个满足条件的最佳行李摆放位置。如果没有任何空位置,请你输出 − 1 -1 1

输入格式

第一行一个整数 n n n,表示每一列位置数量。
第二行 n n n 0 0 0 1 1 1 的整数,第 i i i 个整数表示左列 i i i 个位置是否已经有行李,若为 1 1 1 则有行李,若为 0 0 0 则没有行李。
第三行 n n n 0 0 0 1 1 1 的整数,第 i i i 个整数表示右列 i i i 个位置是否已经有行李,若为 1 1 1 则有行李,若为 0 0 0 则没有行李。

第四行,两个整数 p , q p, q p,q,表示小 S 所在位置是哪一列,在这一列的哪个位置。

输出格式

输出一行,若有可以摆放行李的位置,则输出两个整数,分别表示最佳位置在左列还是右列,最佳位置与小 S 所在位置的距离

如果没有可以放行李的位置,则输出一个整数 − 1 -1 1

样例 #1

样例输入 #1

5
0 1 1 1 1
1 0 1 1 1
0 3

样例输出 #1

1 1

样例 #2

样例输入 #2

5
0 1 1 1 1
0 1 1 1 1
0 3

样例输出 #2

0 2

样例 #3

样例输入 #3

5
1 1 1 1 1
1 1 1 1 1
0 3

样例输出 #3

-1

提示

样例 1 解释

为了方便观察,我们用 绿色 \textcolor{green}{绿色} 绿色来表示没有行李的空位,用 红色 \textcolor{red}{红色} 红色来表示有行李。

样例 1 如图:

此时由于右列第 2 2 2 个位置距离小 S 更近,所以右列第 2 2 2 个位置是最佳位置,答案是 1 1 (表示这个位置在右列,和小 S 位置距离为 1 1 1)。

样例 2 解释

样例 2 如图:

此时由于两个位置距离小 S 都相同,而左列的那个位置和小 S 在同一列,所以答案是 0 2 (表示这个位置在左列,和小 S 位置距离为 2 2 2)。

样例 3 解释

由于没有任何一个空位,所以输出 − 1 -1 1

数据范围

对于前 30 % 30 \% 30% 的数据,保证小 S 一定在左列,左列所有位置一定都有行李。
对于另 30 % 30 \% 30% 的数据,保证左列有且仅有一个空位置,右列有且仅有一个空位置。
对于 100 % 100 \% 100% 的数据,保证 1 ≤ q ≤ n ≤ 1 0 6 1 \leq q \leq n \leq 10^6 1qn106 p p p 0 0 0 1 1 1,第二行、第三行读入的整数为 0 0 0 1 1 1

题解

想法

我们先开两个数组,存放0排和1排的数据,然后for()遍历数组,打擂台获取距离小S最近的空位:

int il[N];
int jl[N];
int main(){
	int n,p,q,nst0=INT_MAX,nst1=INT_MAX;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>il[i];
    }
    for(int i=1;i<=n;i++){
        cin>>jl[i];
    }
    cin>>p>>q; //p,q是后面的
    for(int i=1;i<=n;i++){
        if(il[i]==0&&abs(i-q)<nst0) nst0=abs(i-q);
        if(jl[i]==0&&abs(i-q)<nst1) nst1=abs(i-q);
    }
}

后面的就很简单了,直接判断:

if(nst0==INT_MAX&&nst1==INT_MAX){
	cout<<-1;
	return 0;
}
//先判断nst0和nst1是否都没有变化,一定先判断,因为如果后面nst0==nst1条件成立的话输出会出问题,然后停止程序,以免重复判断
if(nst0<nst1) cout<<0<<' '<<nst0;
else if(nst0>nst1) cout<<1<<' '<<nst1;
else if(nst0==nst1) cout<<p<<' '<<nst0; //p就是小S站的那一排

完整代码

#include <bits/stdc++.h>
#define N 1000020
int il[N];
int jl[N];
using namespace std;
int main(){
    int n,p,q,nst0=INT_MAX,nst1=INT_MAX;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>il[i];
    }
    for(int i=1;i<=n;i++){
        cin>>jl[i];
    }
    cin>>p>>q;
    for(int i=1;i<=n;i++){
        if(il[i]==0&&abs(i-q)<nst0) nst0=abs(i-q);
        if(jl[i]==0&&abs(i-q)<nst1) nst1=abs(i-q);
    }
    if(nst0==INT_MAX&&nst1==INT_MAX){
    	cout<<-1;
    	return 0;
    }
    if(nst0<nst1) cout<<0<<' '<<nst0;
    else if(nst0>nst1) cout<<1<<' '<<nst1;
    else if(nst0==nst1) cout<<p<<' '<<nst0;
   
}
  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值