少なくとも直径1ユニット以上の長いパイプを複雑な地形の洞窟に水平に送り込むことは可能でしょうか?下の 2 つの写真は洞窟の断面を示しており、濃い青色の破線は洞窟の上部と底部の輪郭を示しています。図1は可能で、緑色の部分は直径1のパイプを供給できることを示しています。図 2 は、上部または下部のオーバーハングを高さ 1 単位だけ削り取らない限り不可能です。
この問題では、特定の洞窟に建設が可能かどうかを判断するプログラムを書くように求められます。
入力形式:
最初の行に 100 を超えない正の整数 N を入力します。これは水平サンプリング ポイントの数です。次の 2 行のデータは、左から右に順番にサンプリング ポイントの縦座標を示します。1 行目は洞窟の上部のサンプリング ポイント、2 行目は洞窟の底のサンプリング ポイントです。ここで、座標原点は左下隅であり、各縦軸は 1000 を超えない非負の整数であると仮定します。並列番号はスペースで区切られます。
タイトルにより、入力データが妥当であること、つまり洞窟の底部の等高線が上部の等高線と交差しないことが保証されます。
出力フォーマット:
直接施工が可能な場合は出力と1ラインで Yes
供給できるパイプの最大直径 、そうでない場合は出力No
と少なくとも切断が必要な高さ。答えと数字はスペース1つで区切ります。
入力サンプル 1:
11
7 6 5 5 6 5 4 5 5 4 4
3 2 2 2 2 3 3 2 1 2 3
出力サンプル 1:
Yes 1
入力サンプル 2:
11
7 6 5 5 6 5 4 5 5 4 4
3 2 2 2 3 4 3 2 1 2 3
出力サンプル 2:
No 1
このトピックは非常に簡単で、入力時に上端の最低点と下端の最高点を記録するだけです。条件を満たしているかどうかを比較して判断できます。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main(){
int N,num,TopMin=1005,lowMax=0;
cin>>N;
for(int i=1;i<=N;i++){
cin>>num;
if(num<TopMin)
TopMin=num;
}
for(int i=1;i<=N;i++){
cin>>num;
if(num>lowMax)
lowMax=num;
}
//如果上沿的最低点 大于 下沿最高点 那么可以修管道,他们的差值就是管道的最大宽度
if(TopMin>lowMax){
cout<<"Yes "<<TopMin-lowMax;
}else{
//如果不满足 则比较 上沿的最低点和 下沿的最高点 之间的差值+1 就是需要削减的高度 管道宽度至少为 1
cout<<"No "<<(lowMax-TopMin+1);
}
return 0;
}