标签:div getch name return class family include stream open
区间覆盖问题
数轴上有N个闭区间[Ai, Bi],选择尽量少的区间覆盖一条指定线段[S, T]。
读入时预处理,区间外的直接忽略掉,根据左端点从小到大排序一下,开始找满足左端点小于等于目前已覆盖区间的右端点、并且右端点更大的区间【绕口令吗,我在说什么......如果没找到就输出No Solution
贴
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define N 1000005 5 inline int read(){ 6 int s=0,w=1; 7 char ch=getchar(); 8 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();} 9 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+ch-‘0‘;ch=getchar();} 10 return s*w; 11 } 12 struct p{ 13 int a,b; 14 friend bool operator < (p x,p y) 15 { 16 if(x.a==y.a) return x.b<y.b; 17 return x.a<y.a; 18 } 19 }qy[N]; 20 int main() 21 { 22 int n=read(),s=read(),t=read(),cnt=0; 23 while(n--) 24 { 25 int x=read(),y=read(); 26 if(x>t||y<s) continue; 27 qy[++cnt].a=x,qy[cnt].b=y; 28 } 29 sort(qy+1,qy+cnt+1); 30 int now=s,i=1,ans=0; 31 while(now<t) 32 { 33 ans++; 34 int kk=now; 35 for(;qy[i].a<=kk&&i<=cnt;i++) 36 now=max(now,qy[i].b); 37 if(now==kk&&kk<t){cout<<"No Solution\n";break;} 38 } 39 if(now>=t) cout<<ans<<endl; 40 }
同理,喷水覆盖那题预处理掉直径小于宽度的,存入直径就ok
区间不相交问题
有n项工作,每项工作分别在 si时间开始,ti时间结束。你的目标是参与尽可能多的参与工作,那么最多能参与多少项工作呢?
写得时间太久远了,但是还是能看懂的
直接贴
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 #define MAX 100005 5 struct p{ 6 int yi,er; 7 }qy[MAX]; 8 bool cmp(p a,p b) 9 { 10 return a.er<b.er; 11 } 12 int main() 13 { 14 int n; 15 while(cin>>n&&n) 16 { 17 for(int i=0;i<n;i++) cin>>qy[i].yi; 18 for(int i=0;i<n;i++) cin>>qy[i].er; 19 sort(qy,qy+n,cmp); 20 int ans=0,t=0; 21 for(int i=0;i<n;i++) 22 if(t<qy[i].yi) 23 { 24 t=qy[i].er; 25 ans++; 26 } 27 cout<<ans<<endl; 28 } 29 }
区间选点问题
给定x轴上的n个闭区间[ai, bi],选取尽可能少的点,使得每个闭区间至少有一个点(不同区间所含的点可以是同一个)。
排序后把第一个区间的最后一个点往下对下来,包含这个点的区间都不看,ans=1,再把点更新为出现的第一个不包含这个点的区间右端点【我好绕......。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define N 1000005 5 inline int read(){ 6 int s=0,w=1; 7 char ch=getchar(); 8 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();} 9 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+ch-‘0‘;ch=getchar();} 10 return s*w; 11 } 12 struct p{ 13 int a,b; 14 friend bool operator < (p x,p y) 15 { 16 if(x.b==y.b) return x.a>y.a; 17 return x.b<y.b; 18 } 19 }qy[N]; 20 int main() 21 { 22 int t=read(); 23 for(int i=0;i<t;i++) qy[i].a=read(),qy[i].b=read(); 24 sort(qy,qy+t); 25 int node=qy[0].b,ans=1; 26 for(int i=1;i<t;i++) 27 if(qy[i].a>node) node=qy[i].b,ans++; 28 cout<<ans<<endl; 29 }
标签:div getch name return class family include stream open
原文地址:https://www.cnblogs.com/Aaaamber/p/11282946.html