14:カーペット

合計時間制限:1000msのメモリ制限:65536kBの
説明
特別表彰式を調製するためには、会場の矩形領域内の主催者は、長方形のカーペットの一部で覆われた(直交座標系の第一象限と見ることができます)。1からnまでの番号Nカーペットの合計。今連続軸に平行に敷設され、これらの数字カーペット昇順に従って、カーペットを敷設した後、以前に敷設カーペットの上に重ね。カーペットの敷設が完了した後、主催者はポイント数の最上階を覆うカーペットを知りたいです。注:矩形の境界上の点、及びカーペットの4つの頂点がカーペットで覆われて考えることができます。

説明入力出力サンプル1:以下、二重実線で示す破線カーペット番号2で示される実線で示すカーペット1、第3号は、カーペットカーペット3最上層である点(2,2)をカバー。

説明入力出力サンプル2:以下、二重実線で示す破線カーペット番号2で示される実線で示すカーペット1、第3号は、カーペットカーペット3最上層である点(4,5)をカバー。

入力
入力コモン行N + 2。
最初の行、整数n、nは総カーペットを表します。
次の行n iは、それぞれ、カーペットスペースで区切られた2つの整数それぞれ、間に4つの正の整数であり、B、G、Kを含む、カーペット情報を表し、I + 1行数左下隅とカーペットXおよびY軸方向の長さの座標(A、B)。
N + 2番目のラインは、2つの正の整数xとyが含まれ、接地点に必要な表現(x、y)を座標。

データの30%、そこn≤2、
データの50%、0≦A、B、G、k≤100ため 、
データの100%に、そこ0≤n≤10,000,0≤a、B、G、 k≤100,000。
出力
カーペットの数を表す出力コモンライン1、整数、必須;カーペットを出力ここで覆われていない場合は-1。
サンプル入力
サンプル#1:
3
1 3 0 2
0 2 3 3
2 3 3 1
2 2

サンプル#2:
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5。
サンプル出力の
サンプル#1:
3

サンプル#2:
-1
ソースは
再戦セットに最初の質問を改善NOIP2011

分析
座標を決定する(x、y)は、i番目のカーペット、カーペット上部出力です。

#include<iostream>
using namespace std;
//这几个数组分别表示第i个地毯的左右和上下界限 
int wL[10005],wR[10005],hL[10005],hH[10005];
//函数用来判断坐标是否在第n个地毯上 
bool inFootcloth(int n,int x,int y){
//如果这个点在地毯的界限内,返回真,否则,返回假
	if(x>=wL[n]&&x<=wR[n]&&y>=hL[n]&&y<=hH[n]){
		return true;
	}else{
		return false;
	}
}
int main(){
	int n;
	cin>>n;
	//输入并记录第i个地毯的上下左右界限
	for(int i=1;i<=n;i++){
		int a,b,g,k;
		cin>>a>>b>>g>>k;
		
		wL[i]=a;
		wR[i]=a+g;
		hL[i]=b;
		hH[i]=b+k;
	}
	
	int x,y;
	cin>>x>>y;
	//因为是输出最上面的地毯,所以从第n个地毯开始依次往下找,第一个覆盖这个点的地毯即为所求 
	for(int i=n;i>=1;i--){
		if(inFootcloth(i,x,y)){
			cout<<i;
			return 0;
		}
	}
	
	cout<<"-1";
	
	return 0;
} 
公開された36元の記事 ウォンの賞賛0 ビュー337

おすすめ

転載: blog.csdn.net/weixin_44437496/article/details/104045943