题目背景
年轻的 Mirko 把火柴扔的到处都是。他的母亲希望他将火柴放入盒子中。
题目描述
Mirko 现在要放置 �n 根火柴,他有一个 �×ℎw×h 的矩形盒子。
他现在想请你进行判断这 �n 根火柴每一个是否能够放入这个盒子。
我们可以把盒子看成一个平面,只需要判断火柴是否能够在这个平面内放下即可。
输入格式
输入第一行为三个整数 �,�,ℎn,w,h。
接下来的 �n 行,每行一个 [1,1000][1,1000] 区间内的整数,表示一根火柴的长度。
输出格式
输出共 �n 行,对于每根火柴,输出 DA
表示能放下,否则输出 NE
表示放不下。
输入输出样例
输入 #1复制
5 3 4 3 4 5 6 7
输出 #1复制
DA DA DA NE NE
输入 #2复制
2 12 17 21 20
输出 #2复制
NE DA
说明/提示
数据规模与约定
对于 100%100% 的数据,保证 1≤�≤501≤n≤50,1≤�,ℎ≤1001≤w,h≤100。
说明
题目译自 COCI2006-2007 CONTEST #4 T1 SIBICE
原问题不难转换为:如果火柴长度≤≤矩形内以及矩形上两点最远距离,则输出DA
,否则输出NE
。
现在我们求矩形内以及矩形上最远两点的距离:
设矩形顶点�(0,0),�(0,�),�(�,�),�(�,0)A(0,0),B(0,y),C(x,y),D(x,0),这里�,�>0x,y>0
矩形内或矩形上两点�(�1,�1),�(�2,�2)E(x1,y1),F(x2,y2),那么显然0≤�1,�2≤�,0≤�1,�2≤�0≤x1,x2≤x,0≤y1,y2≤y
��=(�1−�2)2+(�1−�2)2EF=(x1−x2)2+(y1−y2)2
∵∣�1−�2∣≤�,∣�1−�2∣≤�∣x1−x2∣≤x,∣y1−y2∣≤y
∴��≤�2+�2EF≤x2+y2
因此,只要火柴长度≤�2+ℎ2≤w2+h2即可放下。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,w,h,x,i;
cin>>n>>w>>h;
for(i=1;i<=n;i++){
cin>>x;
if(x*x<=w*w+h*h) cout<<"DA"<<endl;
else cout<<"NE"<<endl;
}
return 0;
}
拜拜!