标签:for 测试 ace tar else 比较 情况 span bit
数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]。
把各区间按照a从小到大排序。如果区间1的起点不是s,无解,否则起点在s的最长区间。选择[ai,bi]后,新的起点设置成bi。直至覆盖整个线段。
N:测试数据组数
begin,end:要覆盖区间的起始和终止点
n:区间数。后面跟随n个区间
覆盖的具体区间 以及 覆盖区间的总数
代码:
#include<iostream> #include<algorithm> using namespace std; const int maxn=20; struct timetable { int a; int b; }time[maxn]; bool comp(timetable &x,timetable &y)//多看两遍 { return (x.a<y.a); } int main() { int i,j,N,n,count; int begin,end; while(cin>>N)//N表示有几组测试数据 { while(N--) { cin>>begin>>end; cin>>n;//n个区间 for(i=0;i<n;i++) { cin>>time[i].a; cin>>time[i].b; } sort(time,time+n,comp);//区间按照a从小到大排序 count=0; int len=0,maxlen,tmp; int newbegin=begin; i=0; while(len<end-begin) { maxlen=0; for(i=0;i<n;i++)//找当前begin情况下最长 { if(time[i].a<=newbegin) { tmp=time[i].b-newbegin; if(tmp>maxlen) { maxlen=tmp; j=i; } } else break; } if(maxlen==0)//说明断了,不存在连续覆盖 { cout<<"no exit;"; return 0; } cout<<"("<<time[j].a<<","<<time[j].b<<")"<<" "; len+=maxlen; count++; newbegin=time[j].b; } cout<<endl<<count<<endl; } } }
集合具体题目分析:题目链接
注意因为这里只看整数,我们写的是a[i].l<=mn+1(mn,mx分别为最小,和最大)
这个题比较简单,固定0-n,且不需要输出覆盖的区间
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int inf=1<<30; 4 typedef long long ll; 5 typedef pair<int,int> P; 6 const double pi=acos(-1); 7 const int mod=998244353; 8 const int maxn=1e5+7; 9 const int maxm=6300; 10 struct node{ 11 int l,r; 12 }a[maxn]; 13 bool cmp(const node &a,const node &b){ 14 if(a.l==b.l) return a.r>b.r; 15 return a.l<b.l; 16 } 17 int main(){ 18 int n,m;scanf("%d%d",&n,&m); 19 int ans=0,mn=0,mx=0; 20 for(int i=0;i<m;i++){ 21 scanf("%d%d",&a[i].l,&a[i].r); 22 } 23 sort(a,a+m,cmp); 24 int res=0; 25 while(1){ 26 if(mn>=n) break; 27 res=0; 28 for(int i=0;i<m;i++){ 29 if(a[i].l<=mn+1){ 30 if(a[i].r>mx){ 31 mx=a[i].r; 32 res=1; 33 } 34 } 35 } 36 if(res){ 37 mn=mx;ans++; 38 } 39 else break; 40 } 41 if(res){ 42 cout<<ans<<endl; 43 } 44 else cout<<-1<<endl; 45 return 0; 46 }
标签:for 测试 ace tar else 比较 情况 span bit
原文地址:https://www.cnblogs.com/qingjiuling/p/10503264.html