洛谷P3845-球赛【离散化,贪心】

正题

题目连接:
https://www.luogu.org/problemnew/show/P3845
AC信息:
https://www.luogu.org/record/show?rid=6955910


大意

有一些比分记录,不过双方可能会搞反(如 1 2 可能会记录成 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);
    }
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/80070497
今日推荐