9 条题解
-
31
小提示
使用差分处理,依次在输入的每个区间上加1,检查最终结果是否是“连续的一段0-连续的一段1-连续的一段0”这样的结构即可。很简单!!!
加油!!!
代码如下👇
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct qj { int a; int b; }; qj q[50009]; bool cmp(qj &m, qj &n) { if(m.a<n.a) return true; else return false; } int main() { int n; cin>>n; int c_min=10005,c_max=0; int a,b; bool is_ok = true; for(int i=0;i<n;i++) { cin>>q[i].a>>q[i].b; } sort(q, q+n,cmp); for(int i=0;i<n;i++) { if(c_min>c_max) { c_min = q[i].a; c_max = q[i].b; } if(q[i].a<=c_min&&q[i].b>=c_min) { c_min = q[i].a; c_max = max(c_max, q[i].b); } else if(q[i].a>=c_min&&q[i].a<=c_max) { c_max = max(c_max, q[i].b); } else { is_ok = false; } } if(is_ok) cout<<c_min<<" "<<c_max<<endl; else cout<<"no"<<endl; }
小提示
这玩意是90分的 AC自己写#include<bits/stdc++.h> using namespace std; int n,a,b,d[50005],x,y; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a>>b; d[a]++; d[b+1]--; } for(int i=1;i<=10000;i++) { d[i]+=d[i-1]; } int p=1; while(d[p]==0&&p<=10000) { p++; } x=p; while(d[p]>0&&p<=10000) { p++; } y=p-1; while(d[p]>0&&p<=10000) { p++; } if(p==10001) { cout<<x<<" "<<y; } else{ cout<<"no"; } return 0; }
大提示
这玩意是50分的 AC还是得自己写AC
这玩意是AC#include<bits/stdc++.h> using namespace std; int n,a,b,d[50005],x,y; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a>>b; d[a]++; d[b+1]--; } for(int i=1;i<=10000;i++) { d[i]+=d[i-1]; } int p=1; while(d[p]==0&&p<=10000) { p++; } x=p; while(d[p]>0&&p<=10000) { p++; } y=p-1; while(d[p]==0&&p<=10000) { p++; } if(p==10001) { cout<<x<<" "<<y; } else{ cout<<"no"; } return 0; }
-
4
题解
点赞带走
请大家点个赞吧!
AC代码
#include <bits/stdc++.h> using namespace std; int n, a, b, d[50005], x, y; int main() { cin >> n; for (int i = 1;i <= n;i++) { cin >> a >> b; d[a]++; d[b + 1]--; } for (int i = 1;i <= 10000;i++) { d[i] += d[i - 1]; } int p = 1; while (d[p] == 0 && p <= 10000) { p++; } x = p; while (d[p] > 0 && p <= 10000) { p++; } y = p - 1; while (d[p] == 0 && p <= 10000) { p++; } if (p == 10001) { cout << x << " " << y; } else { cout << "no"; } return 0; }
需求
点个赞吧! -
3
#include <bits/stdc++.h> using namespace std; int main() { int n,a[50005],b[50005]; int left = 10000,right = 0; cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i] >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + n + 1); for(int i = 1; i <= n; i++) { if(b[i] < a[i + 1]) { cout << "no"; return 0; } left = min(left,a[i]); right = max(right,b[i]); } cout << left << " " << right; return 0; }
-
3
使用差分处理,依次在输入的每个区间上加1,检查最终结果是否是“连续的一段0-连续的一段1-连续的一段0”这样的结构即可。
核心代码
for (int i = 1; i <= 10000; i++) { d[i] += d[i - 1]; } int p = 1; while (d[p] == 0 && p <= 10000) { p++;//连续的一段0 } x = p; while (d[p] > 0 && p <= 10000) { p++;//连续的一段1 } y = p - 1; while (d[p] == 0 && p <= 10000) { p++;//连续的一段0 } if (p == 10001) {//如果到结尾了,说明结构符合要求 cout << x << " " << y; } else { cout << "no"; }
-
2
这道题我采用了结构体排序的思路,看完别忘了点一个大大的赞~~~ 不要看我短就忽略我!!!
具体思路
由这道题的题意可知,上一个区间的b需要大于等于下一个数据的a,所以a越小越容易与其他区间合并,所以将结构体数组按a的大小排序 left表示最左端点,right表示最右端点 先将left和right初始化为排序后第一个区间,然后从第二个区间开始遍历,left取min,right取max, 在此中间如果有断层情况,区间便不能完全合并,直接输出no即可cmp函数
bool cmp(Q x,Q y) { if (x.a == y.a) { return x.b < y.b; } return x.a < y.a; }
核心代码
sort(s+1,s+n+1,cmp); left = s[1].a; right = s[1].b; for (int i = 2;i <= n;i++) { if (right < s[i].a) { cout << "no" << endl; return 0; } left = min(s[i].a,left); right = max(s[i].b,right); }
AC代码,建议同学们慎重打开,要动脑思考
#include <bits/stdc++.h> using namespace std; struct Q { int a,b; }s[50005]; bool cmp(Q x,Q y) { if (x.a == y.a) { return x.b < y.b; } return x.a < y.a; } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//加速,可以没有,看个人习惯 int n,left,right; cin >> n; for (int i = 1;i <= n;i++) { cin >> s[i].a >> s[i].b; } sort(s+1,s+n+1,cmp); left = s[1].a; right = s[1].b; for (int i = 2;i <= n;i++) { if (right < s[i].a) { cout << "no" << endl; return 0; } left = min(s[i].a,left); right = max(s[i].b,right); } cout << left << " " << right; return 0; }
-
1
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct qj { int a; int b; }; qj q[50009]; bool cmp(qj &m, qj &n) { if(m.a<n.a) return true; else return false; } int main() { int n; cin>>n; int c_min=10005,c_max=0; int a,b; bool is_ok = true; for(int i=0;i<n;i++) { cin>>q[i].a>>q[i].b; } sort(q, q+n,cmp); for(int i=0;i<n;i++) { if(c_min>c_max) { c_min = q[i].a; c_max = q[i].b; } if(q[i].a<=c_min&&q[i].b>=c_min) { c_min = q[i].a; c_max = max(c_max, q[i].b); } else if(q[i].a>=c_min&&q[i].a<=c_max) { c_max = max(c_max, q[i].b); } else { is_ok = false; } } if(is_ok) cout<<c_min<<" "<<c_max<<endl; else cout<<"no"<<endl; }
-
1
#include <bits/stdc++.h> using namespace std; struct interval //定义区间结构体{ int left,right; }a[50005]; int n; bool cmp(interval x,interval y){//对区间左端点进行排序 return x.left < y.left; } int main(){ cin >> n; for (int i = 1; i <= n; i++) cin >> a[i].left >> a[i].right; //输入区间 sort(a+1,a+n+1,cmp); //对区间数组排序 for (int i = 1; i <= n; i++){ if (a[i].right >= a[i+1].left){//满足合并条件 a[i+1].left = min(a[i].left,a[i+1].left); a[i+1].right = max(a[i].right,a[i+1].right); //为了保证合并的区间正确性 } else{//不满足合并条件,直接输出no结束程序 cout << "no"; return 0; } } cout << a[n].left << ' ' << a[n].right; //由于合并区间是向后合并,所以数组取最后一个值 return 0; }
-
1
小提示: 排序后,只要比对左右端点,就能解决
#include <iostream> #include <algorithm> using namespace std; struct Qj{ int a; int b; }qj[50001]; bool cmp(Qj x,Qj y){ return x.a<y.a; //左端点越靠前,对后面影响越大 } int main(void){ int n,Min,Max; cin>>n; for(int i=1;i<=n;i++) cin>>qj[i].a>>qj[i].b; sort(qj+1,qj+n+1,cmp); //排序 Min=qj[1].a; Max=qj[1].b; //初始化 for(int i=2;i<=n;i++) if(qj[i].a<=Min&&qj[i].b>=Min){ Min=qj[i].a; Max=max(Max,qj[i].b); //左端点<=已合并区间左端点,右端点>=已合并区间右端点 } else if(qj[i].a>=Min&&qj[i].a<=Max) Max=max(qj[i].b,Max); //左端点在已合并的区间中间 else{ cout<<"no"; //合并不了 return 0; } cout<<Min<<' '<<Max; return 0; } //已AC
- 1
信息
- ID
- 257
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 678
- 已通过
- 385
- 上传者