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