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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架