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

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

#include 
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;
}

你可能感兴趣的:(枚举)