BZOJ4995-[Usaco2017 Feb]Why Did the Cow Cross the Road

题目

考虑将线段按照右端点递增的顺序排列相同情况下按照左端点排列

每次贪心将距离这个线段左端点最近的鸡给它

网上的题解都用了指针之类的东西,让我难以理解,所以特地写了一份基础代码。

时间复杂度有点难看。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=20005;
 4 int n,m,t[N],ans,b[N],nxt[N],pre[N];
 5 struct node
 6 {
 7     int l,r;
 8 }a[N];
 9 int cmp(node x,node y)
10 {
11     if(x.r==y.r)return x.l<y.l;
12     return x.r<y.r;
13 }
14 int main()
15 {
16     scanf("%d%d",&n,&m);
17     for(int i=1;i<=n;i++)scanf("%d",&t[i]),nxt[i]=i+1,pre[i]=i-1;
18     for(int i=1;i<=m;i++)scanf("%d%d",&a[i].l,&a[i].r);
19     sort(t+1,t+n+1);
20     sort(a+1,a+m+1,cmp);
21     memset(b,0,sizeof(b));
22     for(int i=1;i<=m;i++)
23     {
24         int l=1,r=n;
25         while(l<r)
26         {
27             int mid=(l+r)>>1;
28             if(t[mid]>=a[i].l)r=mid;else l=mid+1;
29         }
30         if(!b[l]&&t[l]>=a[i].l&&t[l]<=a[i].r)b[l]=1;else
31         {
32             while(b[l]&&l<=n&&t[l]<=a[i].r)l++;
33             if(t[l]>a[i].r||l>n||t[l]<a[i].l)continue;
34             b[l]=1;
35         }
36     }
37     int ans=0;
38     for(int i=1;i<=n;i++)if(b[i])ans++;
39     printf("%d\n",ans);
40     return 0;
41 }
View Code

猜你喜欢

转载自www.cnblogs.com/Jack-Oran/p/11234103.html