正题
题目连接:
https://www.luogu.org/problemnew/show/P3845
AC信息:
https://www.luogu.org/record/show?rid=6955910
大意
有一些比分记录,不过双方可能会搞反(如1−21−2可能会记录成2−12−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);}
}