5 条题解
-
5
叮咚,鉴定结果为贪心,贪心策略:优先选结束时间造的。(
课上有原题)#include <bits/stdc++.h> using namespace std; int n, m = -0x3f, ans; // n含义在题目中,m是用来记录开始时间的,目的是防止时间冲突,所以要把m设为极小值,ans是用来记录答案的 struct T // 定义结构体,名字嘛——我随便取了一个 { int begin, end; // begin是开始时间,end是结束时间 }a[105]; // 有题目中可知,n的范围是1~100 bool cmp(T x, T y) // cmp函数数,用来个结构体排序,排序目的是优先选结束时间早的 { return x.end < y.end; // 自定义排序顺序的比较代码 } int main() // 主函数 { ios::sync_with_stdio(false); // 读入加速,没什么可讲吧 cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i].begin >> a[i].end; // 上面是输入,没什么可讲吧,不会的话你学OI干啥啊?白学了 sort (a + 1, a + n + 1, cmp); // 结构体排序,cmp功能见cmp中的注释 for (int i = 1; i <= n; i++) { if (m <= a[i].begin) // 防止时间重叠 { m = a[i].end; // 如果不重叠,那就把时间设为这个活动的开始时间 ans++; // 如果能选,就把答案的计数器加一 } } cout << ans << endl; // 输出,不讲 return 0; // 好习惯 } // 具体思路见注释
End,撒花
-
3
#include <bits/stdc++.h> using namespace std; #define ll long long ll n,ans,now; struct A{ ll l,r; }a[101]; bool cmp(A x,A y){ return x.r<y.r; } int main(){ ios::sync_with_stdio(0); cin>>n; for(ll i=1;i<=n;i++){ cin>>a[i].l>>a[i].r; } sort(a+1,a+n+1,cmp); for(ll i=1;i<=n;i++){ if(a[i].l>=now){ now=a[i].r; ans++; } } cout<<ans; return 0; }
-
2
简单的贪心。
思路就是按结束时间进行排序,越早结束排的越前面,然后计算可以安排的活动有几个即可。
你们最爱的 AC 代码( 10ms):
//无注释版 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; long long n , sum; struct sb{ int bt , et; }dsb[100001]; bool cmp(sb a,sb b){ return a.et < b.et; } int main(){ int t = -1; cin >> n; for(int i = 0;i < n;i++) cin >> dsb[i].bt >> dsb[i].et; sort(dsb,dsb + n,cmp); for(int i = 0;i < n;i++){ if(dsb[i].bt >= t){ sum++; t = dsb[i].et; } } printf("%d",sum); }
轻松 AC 这道非常 㵘 的题,我发现总时间居然是 10ms ,这也太慢了吧。
因此,我把 sort 替换成了手写快排,然后时间就被我优化到了 4ms。
优化后 AC 代码( 4ms ):
#include <cstdio> //printf using namespace std; int n , ans; int t = -1; //上一个活动的结束时间 struct QWQ{ int bt , et; //起始时间,结束时间 }qwq[100005]; void qsort(int l , int r){ //用二分优化的冒泡排序(快排) int mid = qwq[(l + r) >> 1].et; // x >>= 1 位运算 等同于 x /= 2 int i = l , j = r; do{ while(qwq[i].et < mid) i++; while(qwq[j].et > mid) j--; if(i <= j){ QWQ t = qwq[i]; qwq[i] = qwq[j]; qwq[j] = t; i++; j--; } }while(i <= j); if(l < j) qsort(l , j); //递归 if(i < r) qsort(i , r); } int main(void){ scanf("%d" , &n); for(register int i = 0;i < n;i++) //循环加速 scanf("%d%d" , &qwq[i].bt , &qwq[i].et); qsort(0 , n - 1); //快排 for(register int i = 0;i < n;i++){ if(qwq[i].bt >= t){ ans++; t = qwq[i].et; } } printf("%d" , ans); }
- 1
信息
- ID
- 369
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 2
- 标签
- 递交数
- 297
- 已通过
- 192
- 上传者