Codeforces 242(DIV 2) B题
来源:互联网 发布:奥卡姆剃刀知乎 编辑:程序博客网 时间:2024/06/06 19:45
思路:有两种方法:(1)二分枚举答案,(2)排序,然后直接扫描,这里有个小技巧,就是每个节点都保存距离比它小的节点的人数之和,这样可以在降低第二步处理的时间复杂度,总是间复杂度为O(nlogn)+O(n) = O(nlogn)。两种方法运行时间一样,一开始我是直接二分的,做完后看题目标签是sort,然后感觉排序可做,就写了一下。
二分版:
#include<cmath>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define MAXN 1010using namespace std;const double eps = 1e-8;typedef struct Point{ int x, y, man; double dist; void d(){ dist = sqrt(x*x+y*y); }}Point;Point P[MAXN];int n, s;int Judge(double len){ int sum = 0; for(int i = 0;i < n;i ++){ if(P[i].dist + eps < len) sum += P[i].man; if(sum + s >= 1000000) return 1; } return -1;}double binary_Search(double l, double r){ double ll, rr, mid; ll = l, rr = r; while(ll < rr+eps){ mid = (ll + rr)/2; int flag = Judge(mid); if(flag == 1) rr = mid-eps; else if(flag == -1) ll = mid+eps; } return ll;}int main(){ double maxn; /* freopen("in.c", "r", stdin); */ /* freopen("out.cpp" , "w", stdout); */ while(~scanf("%d%d", &n, &s)){ int sum = 0; maxn = eps; for(int i = 0;i < n;i ++){ scanf("%d%d%d", &P[i].x, &P[i].y, &P[i].man); P[i].d(); sum += P[i].man; maxn = max(maxn, P[i].dist); } if(sum + s < 1000000) printf("-1\n"); else if(sum + s == 1000000) printf("%.8lf\n", maxn); else printf("%.8lf\n", binary_Search(eps, maxn)); } return 0;}
sort版:
#include<cmath>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define MAXN 1010const double eps = 1e-8;using namespace std;typedef struct Point{ int x, y, man, sum; double dist; void d(){ dist = sqrt(x*x+y*y); } bool operator < (const Point &A) const{ return dist < A.dist; }}Point;Point P[MAXN];int main(){ int n, s; /* freopen("in.c", "r", stdin); */ while(~scanf("%d%d", &n, &s)){ int sum = 0; double maxn = eps; for(int i = 0;i < n;i ++){ scanf("%d%d%d", &P[i].x, &P[i].y, &P[i].man); P[i].d(); maxn = max(maxn, P[i].dist); sum += P[i].man; P[i].sum = P[i].man; } if(sum + s < 1000000) printf("-1\n"); else if(sum + s == 1000000) printf("%.8lf\n", maxn); else{ sort(P, P+n); for(int i = 0;i < n;i ++){ if(P[i].sum + s >= 1000000){ printf("%.8lf\n", P[i].dist); break; } P[i+1].sum += P[i].sum; //注意这点; } } }}
0 0
- Codeforces 242(DIV 2) B题
- Codeforces Round #242 (Div. 2) B. Megacity
- Codeforces Round #242 (Div. 2) B. Megacity
- Codeforces Round #242 (Div. 2) B. Megacity
- Codeforces Round #169 (Div. 2) B题
- Codeforces Round #188 (Div. 2) B题
- Codeforces Round #218 (Div. 2) B题
- Codeforces Round #238 (Div. 2) B题
- Codeforces Round #402 (Div. 2) B题
- Codeforces Round #404 (Div. 2) B题
- Codeforces Round #446 (Div. 2) B 题
- Codeforces (439B) Round #251 (div.2) B题
- Codeforces (441B) Round #252 (Div. 2) B题
- Codeforces 617B Chocolate (Round #340 (Div. 2) B题)
- Codeforces #261 Div 2 B
- codeforces #368 div.2B
- Codeforces--477Div.2--B
- Codeforces Round #242 (Div. 2) (A、B、C)
- JAVA 大数运算
- POJ 2907
- POJ 3628 Bookshelf 2
- Cocos2d-x 3.0多线程异步资源加载代码
- Codeforces 242(DIV 2) A题
- Codeforces 242(DIV 2) B题
- Codeforces 242(DIV 2) C题
- HDU 1711 Number Sequence
- POJ 2387
- Z-STACK网络建立过程
- 父进程等待子进程终止 wait, WIFEXITED, WEXITSTATUS
- 多媒体通讯协议猜想
- Zigbee入门指导(一)基于CC2430的Zigbee开发环境的建立
- 特殊成员函数