题目描述
给你坐标轴上的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;
}