題意:有兩層的一棟樓,然後每棟樓都放有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;
}