6 条题解
-
5
这是什么power??
#include<bits/stdc++.h> using namespace std; struct t { int sta,end; } a[10086]; //结构体(不用的话可以再压行) bool cmp(t a,t b) {return a.end<b.end;}//将末尾从小到大排序 int main() { int n,sum=0; cin>>n; for(int i=1; i<=n; i++) cin>>a[i].sta>>a[i].end;//输入语句 sort(a+1,a+1+n,cmp);//排序 for(int i=1,t=-1; i<=n; i++) if(a[i].sta>=t) {sum++;t=a[i].end;} cout<<sum; }
18行16行 这个代码看起来这么吊的原因大部分是在for(int i=1,t=-1;i<=n;i++){ if(a[i].sta>=t){sum++;t=a[i].end;} }
上。那为什么这么吊呢? 在输入排序后大概就有这样的感觉1 3
5 4
2 5
6 7
有点合并区间的味道。 将t定义为负数,来帮助录入a[1].sta。第一个数的末尾总是最小的。更新t。之后只要a[i].sta>=t(参考题目)就再次更新t。
-
3
using namespace std; struct p{ int l1; int r1; }sh[1000000]; bool cmp(p a,p b){ return a.r1<b.r1; } int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>sh[i].l1>>sh[i].r1; } sort(sh+1,sh+1+n,cmp); //for(int i=1;i<=n;i++)cout<<sh[i].r1; int l=sh[1].l1; int r=sh[1].r1; int ans=1; for(int i=2;i<=n;i++){ if(sh[i].l1<r){ continue; } else { ans+=1; l=sh[i].l1 ; r=sh[i].r1; } } cout<<ans; return 0; }
-
2
一本通p268
using namespace std; const int N=1001; int beginn[N],endd[N]; int main() { int n,sum=0; cin>>n; for(int i=1;i<=n;i++) cin>>beginn[i]>>endd[i]; for(int i=1;i<=n-1;i++) { for(int u=1;u<=n-2;u++) { if(endd[u]>endd[u+1]) { swap(endd[u],endd[u+1]); swap(beginn[u],beginn[u+1]); } } } for(int i=1,t=-1;i<=n;i++) { if(beginn[i]>=t) { sum++; t=endd[i]; } } cout<<sum; return 0; }
-
1
先排序。这题应该以结束时间为标准降序排,如果开始时间和last重复了就跳掉,如果兼容就变掉last。
#include<bits/stdc++.h> using namespace std; int last,k,t=1,tf[10000],te[10000],j=2; void qs(int l,int r)//二分思想排序 { int i=l,j=r,mid=te[(l+r)/2]; while (i<=j){ while (te[i++]<mid); while (mid<te[j--]); i--;j++; if (i<=j){swap(te[i++],te[j--]);swap(tf[i-1],tf[j+1]);} } if (l<j){qs(l,j);} if (i<r){qs(i,r);} } int main() { cin>>k; for (int i=1;i<=k;i++){ cin>>tf[i]>>te[i]; } qs(1,k); last=te[1]; while (te[j]!=0){ if (tf[j++]>=last){t++;last=te[j-1];} } cout<<t; }
最后再说一遍,我是lxsh的狗!
-
0
大抵就是这样了。👀️
struct node { int s,e; }a[1100]; bool cmp(node x,node y) { return x.e<y.e; } int main() { int ans=1,t,n,i; scanf("%d",&t); for(i=1;i<=t;i++) scanf("%d%d",&a[i].s,&a[i].e); sort(a+1,a+t+1,cmp); n=a[1].e; for(i=2;i<=t;i++) { if(a[i].s>=n) { ans++; n=a[i].e; } } printf("%d",ans); return 0; }
-
0
#include<bits/stdc++.h> using namespace std; const int Maxn=1010; struct s{//定义开始与结束的结构体 int begin; int end; }a[Maxn]; int k=0;//记录次数 bool cmp(s x,s y) { return x.end<y.end; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].begin>>a[i].end; } sort(a+1,a+n+1,cmp);//将结构体中的end从小到大排列 int t=-999;//记录当前区间末尾 for(int i=1;i<=n;i++) { if(a[i].begin>=t)//如果其区间开始时间大于当前选中区间的结束时间 { k++;//则合格的区间加1 t=a[i].end;//将当前合格的区间的结束时间作为下一组比较的结束时间,之后再与下一组的开始时间比较大小即可 } } cout<<k; }
- 1
信息
- ID
- 478
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 852
- 已通过
- 259
- 上传者