正题
题目连接:
https://www.luogu.org/problemnew/show/P3845
AC信息:
https://www.luogu.org/record/show?rid=6955910
大意
有一些比分记录,不过双方可能会搞反(如 1−2 1 − 2 可能会记录成 2−1 2 − 1 )求这之间至少有几场比赛。
解题思路
首先如果是下一场比赛了那么一定会是比分比之前的小了,那么比较一下小的比分然后在比较大的比分就好了。
先把大比分排序,如果相等就小比分排序,然后求导弹拦截问题就好了。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct xxy{
int a,b;
}num[1001];
int f[1001],n,ans,t;
bool cmp(xxy x,xxy y)
{
if (x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
int main()
{
scanf("%d",&t);
for (int ti=1;ti<=t;ti++)
{
memset(num,0,sizeof(num));
memset(f,0,sizeof(f));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d-%d",&num[i].a,&num[i].b);
if (num[i].a<num[i].b) swap(num[i].a,num[i].b);//取小值到b
}
sort(num+1,num+1+n,cmp);//排序
ans=0;
f[++ans]=num[1].b;//记录第一个
int p=0;
for (int i=2;i<=n;i++)
{
p=0;
for (int j=1;j<=ans;j++)
if (num[i].b>=f[j] && f[p]<=f[j]) p=j;
if (p) f[p]=num[i].b;
else f[++ans]=num[i].b;
}//贪心
printf("%d\n",ans);
}
}