4 条题解
-
4
解析:
每个比赛的起始和终止时间,可以看成线段的起点和终点。
两个比赛不能同时参加,相当于线段不能相交。
定义结构体保存所有线段 对所有线段按照右端点从小到大排序 选择区间右端点r初始化为0 遍历所有线段 如果当前线段左端点大于等于r 输出当前线段的id
题解
#include <iostream> #include <algorithm> using namespace std; struct node { int id; int l, r; }; node a[105]; bool cmp(node x, node y) { return x.r < y.r; } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].id >> a[i].l >> a[i].r; } sort(a + 1, a + n + 1, cmp); int r = 0; for (int i = 1; i <= n; i++) { if (a[i].l >= r) // 如果当前线段左端点大于等于r,则代表这是一个独立的区间 { r = a[i].r; cout << a[i].id << " "; } } return 0; }
-
1
思路:
先把所有比赛的时间转化成线段
然后把它们放在一条数轴上
通过分析样例,可以发现:
优先选取线段右端点离原点较近的
选取完以后,把原点挪到右端点的位置接着判断,如果有线段的左端点比原点小,那么说明这条线段与上条线段重合了,否则说明不重合,选取这条线段,移动原点,重复操作直到判断完最后一条线段
#include <iostream> #include <algorithm> using namespace std; struct match { int id,l,r; }; match a[105]; bool cmp(match a,match b) { return (a.r < b.r);//将右端点由小到大排序 } int main() { int n; cin >> n; for(int i = 0;i < n;i++) cin >> a[i].id >> a[i].l >> a[i].r; sort(a,a + n,cmp); int r_index = 0; for(int i = 0;i < n;i++) { if(a[i].l >= r_index)//左端点不在原点后面(没相交) { r_index = a[i].r;//更新原点 cout << a[i].id << ' ';//输出 } } return 0; }
-
1
yasuo👀️
看我把图都贴过来了,真是十分细心(请允许我稍稍自恋一下😄 )
#include <iostream> #include <algorithm> struct node{int id,l,r;}a[105]; bool cmp(node q,node a){return q.r<a.r;} int main(){ int q,r=0;std::cin>>q; for(int i=0;i<q;i++)std::cin>>a[i].id>>a[i].l>>a[i].r; std::sort(a,a+q,cmp); for (int i=0;i<q;i++) if(a[i].l>=r){r=a[i].r;std::cout<<a[i].id<<" ";} return 0;}
-
0
#include <iostream> #include <algorithm> struct fiveline{int id,l,r;}a[105]; bool wuhang(fiveline q,fiveline a){return q.r<a.r;} int main(){int q,r=0;std::cin>>q; for(int i=0;i<q;i++)std::cin>>a[i].id>>a[i].l>>a[i].r; std::sort(a,a+q,wuhang);for (int i=0;i<q;i++)if(a[i].l>=r){r=a[i].r;std::cout<<a[i].id<<" ";}return 0;}
5 行 流
- 1
信息
- ID
- 345
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 769
- 已通过
- 326
- 上传者