http://118.190.162.167/p1016.html
题目描述
小华在玩游戏的时候操纵忍者时遇到这样一个场景,两栋大楼之间有许多绳索,从侧面看,就像这个样子:
我们的忍者非常有好奇心,他可以观察到每个绳索的端点在两栋楼的高度,想知道这些绳索有多少个交点(图中黑色的点)。他观察到建筑上一点上不会有两个绳索,并且没有三条绳索在同一个点交叉(即没有三线共点)。
数据范围
对于小数据
1<=N<=100
对于大数据
1 <= N <= 100000
对于所有数据
1 <= T <= 100
0 <= Ai,Bi<= 1000000000
输入描述
第一行:整数T,代表有T组数据。
下一行:整数N,代表有N条绳索。
接下来Na行给出两个整数Ai, Bi,分别代表绳索端点在左右两边大楼的高度。
输出描述
Case #x: y
x代表样例组数,从1开始。
y代表绳索交点数。
样例输入(精确内容)
2
3
1 10
5 5
7 7
2
1 1
2 2
样例输出(精确内容)
Case #1: 2
Case #2: 0
解题思路:这道题有个非常简单的做法,以某个线为基准,依次判断其余的线与该线是否相交,最后选取相交最多的数(不知道是否还有其他的思路)。
代码:
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<algorithm>
#define MAX 10000
using namespace std;
int Map[100000][3];
int check(int i,int j)
{
if(i==j)return 0;
else
{
if((Map[i][0]-Map[j][0])*(Map[i][1]-Map[j][1])<0) return 1;
else return 0;
}
}
int main()
{
int num,num_hang;
int Case=1;
freopen("input.txt","r",stdin);
cin>>num;
while(num--)
{
memset(Map,0,sizeof(Map));
int Max=0;
cin>>num_hang;
for(int i=0;i<num_hang;i++)
{
cin>>Map[i][0];
cin>>Map[i][1];
}
for(int i=0;i<num_hang;i++)
{
for(int j=0;j<num_hang;j++)
{
if(check(i,j))Map[i][2]++;
}
if(Map[i][2]>Max)Max=Map[i][2];
}
cout<<"Case #"<<Case++<<": "<<Max<<endl;
}
return 0;
}