Southern and Volga Russia Qualifier 2019-2020(L. Printer (枚举))

在这里插入图片描述在这里插入图片描述
题意:有两层的一栋楼,然后每栋楼都放有n张桌子,然后知道这个:
在一个桌子的队伍要到另一个同层的相邻的桌子,那么就需要花费一个单位时间;然后如果要到不同层的桌子,那么就要花费k个单位时间下楼,然后再花一个单位时间到达同层的相邻的桌子;
简而言之:如果在同一层,那么不方便度就是abs(ai-ap),如果不在同一层那么不方便度就是ai+k+ap;
问:现在要放一台打印机(注意:这台打印机也可以放到有队占有的桌子上用),那么求一个坐标使得每个被队伍占有的桌子到这个坐标的最大值中的最小值为多少(也就是求每个队到这个放打印机的桌子的最大不方便度的最小值)?
其实应该这样理解:
比如对于第一个案例:
对于1,1(注意下面一行是第一层,上面一行是第二层,不要搞混淆了)这坐标就是表示这个地方:
在这里插入图片描述
所以你可以手算一下两个1到这个点的最大不方便度为多少;然后取他们之间的最小值;
所以思路就很明确了;就是要枚举每个坐标,每次取所有队中的到这个坐标的最大值的最小值;
AC代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;
    scanf("%d %d",&n,&k);
    string s[2];
    cin>>s[0]>>s[1];
    int Max1=0,Max2=0,ans=0x3f3f3f3f;
    int f,ii;
    for(int i=0;i<s[0].length();i++){
            Max1=0,Max2=0;
           for(int j=0;j<s[0].length();j++){
                if(s[0][j]=='1'){//这里用来表示如果 这个桌子有队伍了
                 Max1=max(Max1,abs(j-i));//这是用来算位于第2层的队伍的不方便度
                 Max2=max(Max2,j+i+2+k);//这是用来算打印机位于i对应的下面1层的队伍的不方便度
                }
           }
            for(int j=0;j<s[0].length();j++){
                    if(s[1][j]=='1'){//这里用来表示第1层的队伍的不方便度
                      Max2=max(Max2,abs(j-i));//这里用来表示打印机在第1层时,对应的不方便度
                      Max1=max(Max1,j+i+2+k);//这里表示打印机在第2层时,对应队伍的不方便度
                    }
           }
           if(Max1<ans){//这里用来存最大值的最小值
             ans=Max1;
             f=2;
             ii=i+1;
           }
           if(Max2<ans){
              ans=Max2;
              f=1;
              ii=i+1;
           }
    }
    printf("%d\n",ans);
    printf("%d %d\n",f,ii);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值