4 条题解
-
5
C++ :
#include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef pair<double, double> PDD; const int N = 1010; const double eps = 1e-6, INF = 1e10; // double一般定义一个eps精确值 int n, R; PDD segs[N]; int main() { bool success = true; cin >> n >> R; for(int i = 0; i < n; i++) { int x, y; cin >> x >> y; if(y > R) { success = false; break; } double len = sqrt(R * R - y * y); segs[i] = {x + len, x - len}; //区间 按终点起点排序 } if(!success) puts("-1"); else { sort(segs, segs + n); int res = 0; double last = -INF; //***这里要定义double for(int i = 0; i < n; i++) { auto seg = segs[i]; if(seg.second > last + eps) //seg.second 是起点 { res ++; last = seg.first; // seg.first的终点 } } cout << res << endl; } return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int n,d,ans; struct node { double x,y; bool vis=0; }a[1010]; //存值 bool cmp(node p,node q) //sort的比较函数 { return p.y<q.y; } int main() { cin>>n>>d; for(register int i=0;i<n;i++) { double p,q,m; cin>>p>>q; if(q>d){cout<<-1;return 0;} m=sqrt(d*d-q*q); a[i].x=p-m,a[i].y=p+m; //读入处理 } sort(a,a+n,cmp); //排序 for(int i=0;i<n;i++) //挨个循环 { if(a[i].vis)continue; ans++; //累加雷达数量 a[i].vis=1; //标记为已经被雷达扫过 for(int j=0;j<n;j++) if(!a[j].vis&&a[i].y>=a[j].x)a[j].vis=1; //标记范围内的所有点 } cout<<ans; //输出所需雷达数量 return 0; //完美结束 }
-
0
#include <cstring> #include <string.h> #include <queue> #include <stack> #include <map> #include<iostream> using namespace std; int main(){ for (int i = 1;i <= 514514;i++) { cout<<"11111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; } return 0; }
AC
-
0
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=1010; int n,d; struct Segment { double l,r; bool operator < (const Segment& t) const { return r<t.r; } }seg[N]; int main() { cin>>n>>d; bool failed=false; for(int i=0;i<n;i++) { int x,y; cin>>x>>y; //将平面问题转化到横轴上的一个个区间 if(y>d) failed=true; //如果比半径大,直接fail else { double len=sqrt(d*d-y*y); seg[i].l=x-len,seg[i].r=x+len; //区间左端点l,区间右端点r } } if(failed) puts("-1"); else { sort(seg,seg+n); int cnt=0; double last=-1e20; //last表示上一个区间的右端点 for(int i=0;i<n;i++) { if(last<seg[i].l) { cnt++; //若下一个区间左端点比上一个区间的右端点小,那么就要再新加一个圆 last=seg[i].r; //更新 } } cout<<cnt; } getchar();getchar(); return 0; }
~111~ ~定过~
- 1
信息
- ID
- 24
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 137
- 已通过
- 89
- 上传者