题目描述
给你坐标轴上的n个点,和n条线段,能否找到一种配对方案使得点与线段之间能形成一一匹配,一个匹配的定义是点在线段内
输入描述:
第一行输入一个整数n (1 ≤ n ≤ 100)
第二行输入n个整数p[i]
第三行输入n个整数l[i]
第三行输入n个整数r[i]
p[i]表示第i个点的位置,l[i],r[i] 表示第i条线段的左右端点
-500 ≤ p[i], l[i], r[i] ≤ 500
输出描述:
如果能找到配对方案,输出"Possible"
否则输出"Impossible"
题目解释:
先对n个整数进行sort排序,再对线段进行排序(所以要建立一个结构体),结构体里的要有一个判断(可以是bool类型的),panduan指的是这条线段有没有用过,如果用过的话,则判断变为0(或是ture变为false),最后进行判断,如果判断没有1的话,则指的是线段全都用过了,则全都可以匹配,否则,就是“Impossible”。
欢迎大家进行讨论,别忘记给小毅儿点个赞欧!
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int p[505];
struct sss
{
int left;
int right;
int panduan=1;
}a[505];
bool cmp(sss x,sss y)
{
if(x.right==y.right)return x.left<y.left;
else return x.right<y.right;
}
int main ()
{
int n;
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> p[i];
}
for (int i=1;i<=n;i++)
{
cin >> a[i].left ;
1. }
for (int i=1;i<=n;i++)
{
cin >> a[i].right;
}
sort (p+1,p+1+n);
sort (a+1,a+1+n,cmp);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if(p[i]>=a[j].left && p[i]<=a[j].right && a[j].panduan==1)
{
a[j].panduan=0;
break;
}
}
}
int len=0;
for (int i=1;i<=n;i++)
{
if(a[i].panduan==1)len=1;
}
if(len==1)cout << "Impossible" << endl;
else cout << "Possible" << endl;
return 0;
}


京公网安备 11010502036488号