C++ 活动安排
试题描述:
设有 n 个活动的集合 E={1,2,……,n},其中每个活动都要求使用统一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi ,且 si < fi。如果选择了活动 i ,则它在时间区间 [si, fi) 内占用资源。若区间 [si, fi) 与 [sj, fj) 不相交,则称活动 i 与活动 j 是相容的。也就是说,当 fi<=sj 或 fj<= si 时,活动 i 与活动 j 相容。选择出由互相兼容的活动组成的最大集合。
输入:
第一行一个整数 n ;
接下来 n 行,每行两个整数 si 和 fi。
输出:
输出尽可能多的互相兼容的互动个数。
输入示例:
4
1 3
4 6
2 5
1 7
输出示例:
2
数据范围:n <= 1000.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include<iostream> using namespace std; int n,begin[1001],end[1001]; void init() //初始化 { cin>>n; for ( int i=1;i<=n;i++) { cin>>begin[i]>>end[i]; //开始与结束时间 } } void qsort( int x, int y) //排序 从小到大 { int i,j,mid,t; //mid为中间值 i=x;j=y;mid=end[(x+y)/2]; while (i<=j) { while (end[i]<mid)i++; //快速排序 while (end[j]>mid)j--; //快速排序 if (i<=j) { t=end[j];end[j]=end[i];end[i]=t; //从小到大排序 t=begin[j];begin[j]=begin[i];begin[i]=t; //从小到大排序 i++;j--; } } if (x<j)qsort(x,j); if (i<y)qsort(i,y); } void solve() { int ans=0; for ( int i=1,t=-1;i<=n;i++) if (begin[i]>=t) //活动二的开始 开始比活动一的结尾小 { ans++; t=end[i]; //记录当前活动的结束时间 } cout<<ans; } int main() { init(); qsort(1,n); solve(); return 0; } |
这道题和活动选择是基本相同的。
在写这道题的时候,先要排序。
排序的方法有桶排序,快速排序。。。。
给一个快排
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<iostream> using namespace std; int a[1000],n=0,p,z,flag=0; void qsort( int x, int y) { int i=x,j=y,mid=a[(x+y)/2]; while (i<=j) { while (a[i]<mid)i++; while (a[j]>mid)j--; if (i<=j) { swap(a[i],a[j]); i++; j--; } } if (x<j)qsort(x,j); if (i<y)qsort(i,y); } int main() { while (scanf( "%d" ,&p)==1) { n++; a[n]=p; } qsort(1,n); for ( int m=1;m<=n;m++) { if (m==n) { cout<<a[m]; } else cout<<a[m]<< " " ; } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步