1423:例题2种树
Posted xiaoyezi-wink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1423:例题2种树相关的知识,希望对你有一定的参考价值。
1423:【例题2】种树
题解
种树要种得少,就要使一棵树给多个区间使用。这样,尽量在重叠区间种树即可,而重叠位置一定是在区间尾部。
处理问题时,先按所有区间的结束位置排序,之后依次处理每个区间,先在第一个区间尾部种满足要求的树,对下一个区间,看差多少棵就在该区间尾部种多少
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int n,m,ans=0,t,k=0; bool vis[50000]; struct app int s,e,v; a[5005]; bool cmp(app x,app y) return x.e <y.e ; int main() memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].s ,&a[i].e ,&a[i].v ); sort(a+1,a+m+1,cmp); for(int i=1;i<=m;i++) k=0; for(int j=a[i].s ;j<=a[i].e ;j++) //遍历种了多少树 if(vis[j]) k++; if(k>=a[i].v ) continue; //该区间树已种够 else for(int z=a[i].e ;z>=a[i].s;z--) //从区间后面往前补 if(!vis[z]) k++; ans++; vis[z]=1; if(k>=a[i].v ) break; //补够即停 printf("%d",ans); return 0;
以上是关于1423:例题2种树的主要内容,如果未能解决你的问题,请参考以下文章
字典树(trie树)学习总结(例题讲解:POJ2001,HDU1251,HDU4825)