IEEEXtreme 10.0 - Food Truck
这是 meelo 原创的 IEEEXtreme极限编程大赛题解
Xtreme10.0 - Food Truck
题目来源 第10届IEEE极限编程大赛
https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/food-truck
Madhu has a food-truck called "The Yummy Goods" that goes to a different business hotspot every day at lunch! Madhu wants to perform location-based advertising to folks in the offices near her halt. To do this she uses the GPS location as a longitude and a latitude at the stop and decides on a radius (r) value. She wants to broadcast advertisement SMSes, to customers within this radius, advertising her food-truck.
She needs your help to generate the list of phone numbers of such folks. She has access to a big file of telecom data, which among other details, contains the phone number, longitude and latitude of active cell-phone users in the city at that moment.
In order to calculate the distance between her stops and her subscribers, she wants you to use the most recent location available for each subscriber. To calculate the distance, you should use the Haversine formula:
d = 2 × r × arcsin (sqrt (sin2((lat1 - lat2)/2) + cos(lat1) × cos(lat2) × sin2((long1 - long2)/2)))
where d is the distance between two points on the surface of the earth, in km's
r is the radius of the earth (6378.137 km for this problem)
lat1, long1 are the latitude and longitude, respectively, of point 1
lat2, long2 are the latitude and longitude, respectively, of point 2
Input Format
The first line contains Madhu's latitude and longitude in degrees, separated by a comma.
The second line contains the radius r in kms, within which she wants to broadcast her advertisement.
The third line is a header for the data in the subsequent lines.
The remaining lines have rows of telecom data of active cellphone users. Each line contains the following comma-separated fields:
A time stamp in
MM/DD/YYYY hh:mmformat.MM, is a two-digit month, e.g.01for January,DDis a two-digit day of month (01through31),YYYYis a four-digit year,hhis the two digits of hour (00through23), andmmis the two digits of minute (00through59)The latitude of the subscriber, in degrees
The longitude of the subscriber, in degrees
The subscriber's phone number, as a 10-digit number
Notes:
Some subscribers may appear multiple times. You should use the most recent entry to determine the location and phone number of a subscriber. If a subscriber appears multiple times, the date/time stamps will differ.
None of the field values will contain commas.
Constraints
In order to eliminate rounding and approximation errors, no subscribers will be at a distance d from Madhu, such that 0.99 × r ≤ d ≤ 1.01 × r
1 ≤ r ≤ 100
There will be at most 50,000 lines in the subscriber list.
Output Format
A comma separated list of phone numbers for subscribers within a radius r of the stop, sorted in ascending order.
Sample Input
18.9778972,72.8321983
1.0
Date&Time,Latitude,Longitude,PhoneNumber
10/21/2016 13:34,18.912875,72.822318,9020320100
10/21/2016 10:35,18.9582233,72.8275845,9020320024
10/21/2016 15:20,18.95169982,72.83525604,9020320047
10/21/2016 15:23,18.9513048,72.8343388,9020357980
10/21/2016 15:23,18.9513048,72.8343388,9020357962
10/21/2016 15:28,18.9548652,72.8332443,9020320027
10/21/2016 14:03,18.9179784,72.8279306,9020357972
10/21/2016 14:03,18.9179784,72.8279306,9020357959
10/21/2016 09:52,18.97523123,72.83494895,9020320007
10/21/2016 09:44,18.9715932,72.8383992,9020357607
10/21/2016 09:44,18.9715932,72.8383992,9020357593
10/21/2016 09:44,18.9715932,72.8383992,9020357584
10/21/2016 14:57,18.93438826,72.82704499,9020320011
10/21/2016 09:56,18.97596514,72.8327072,9020320045
10/21/2016 08:33,18.9811929,72.8353202,9020320084
10/21/2016 13:27,18.9159265,72.8245989,9020357896
10/21/2016 13:09,18.9077347,72.8076201,9020320094
10/21/2016 10:52,18.97523003,72.83494865,9020320007
Sample Output
9020320007,9020320045,9020320084,9020357584,9020357593,9020357607
Explanation
We can calculate the distance between the location "18.9778972, 72.8321983" and each of the subscribers whose details are provided. Only the 6 phone numbers, listed in the Sample Output set, have a distance to the location of the food-truck that is less than 1.0 km.
题目解析
题目本身并没什么难的,但有几个地方容易犯错误。
几个注意事项:
- 首先Haversine公式里的经纬度是弧度、而输入的数据单位是角度,需要进行转换。
- 不要忘了所有的经纬度都要转换,包括店铺的位置和客户的位置。
- 读入数据用scanf比cin要容易一些。
- 可以创建一个结构体来保存用户的数据,key为电话号码。
- 输出的升序是电话号码的升序。
- 读取行数不确定的输入,可以用while(scanf(...) != EOF)
- 比较时间的前后关系,可以先把时间转换成一个数,转换过程中可以把每个月都算31天,每年都算366天。
程序
C++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
#include <string> #define PI 3.1415926 using namespace std; struct Custom {
int year, month, day, hour, minute, second;
double lat, long_; int timeNumber() const {
return second + minute* + hour* + day*
+ month* + (year-)*;
} bool earlyThan(const Custom & that) {
return timeNumber() < that.timeNumber();
} bool inRange(double r, double myLat, double myLong) const {
double d = * 6378.137 * asin (sqrt ( pow(sin((lat-myLat)/),) + cos(lat) * cos(myLat) * pow(sin((long_-myLong)/),)));
return d < r;
}
}; double degree2radian(double degree) {
return degree / * PI;
} int main() {
double myLat, myLong, r; scanf("%lf,%lf", &myLat, &myLong);
myLat = degree2radian(myLat);
myLong = degree2radian(myLong); scanf("%lf", &r);
map<long long, Custom> customs; string ignore;
cin >> ignore; Custom c;
long long phone;
while(scanf("%d/%d/%d %d:%d,%lf,%lf,%lld", &c.day, &c.month, &c.year, &c.hour, &c.minute, &c.lat, &c.long_, &phone) != EOF) {
c.lat = degree2radian(c.lat);
c.long_ = degree2radian(c.long_);
if(customs.find(phone) == customs.end()) {
customs[phone] = c;
}
else {
if(customs[phone].earlyThan(c)) {
customs[phone] = c;
}
}
c = customs[phone];
} bool first = true;
for(const auto kv : customs) {
if( kv.second.inRange(r, myLat, myLong) ) {
if(!first) cout << ',';
first = false;
cout << kv.first;
}
} return ;
}
Python2
from datetime import datetime
from math import radians, cos, sin, asin, sqrt
import sys def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6378.137
return c * r lat, lon = map(float, raw_input().split(","))
r = float(raw_input())
raw_input()
d = {}
d = {}
for line in sys.stdin:
subscriber = line.strip().split(",") dat = datetime.strptime(subscriber[0], "%m/%d/%Y %H:%M")
h = haversine(lon, lat, float(subscriber[2]), float(subscriber[1]))
if subscriber[3] in d:
if dat > d[subscriber[3]][0]:
d[subscriber[3]] = [dat, h]
else:
d[subscriber[3]] = [dat, h]
res = []
for phone in d:
if d[phone][1]<=r:
res.append(phone) print ",".join([phone for phone in sorted(res)])
from: blog.chaker.tn/posts/food-truck-ieeextreme-10-0
博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址
IEEEXtreme 10.0 - Food Truck的更多相关文章
- IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...
- IEEEXtreme 10.0 - N-Palindromes
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...
随机推荐
- 框架----Django之文件上传
一.文件上传 1. 浏览器访问 http://127.0.0.1:8000/f1/ http://127.0.0.1:8000/f2/ 2. urls from django.conf.urls im ...
- 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)
前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...
- hdu6166 Senior Pan
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- libxml移植到android
libxml是C语言写的xml解析库,是我们开发可移植程序的首选,下面讲述将其移植到android的步骤 1.下载已经配置好的源代码包android_libxml2.rar http://pan.ba ...
- Java 8 Stream 用法
一.Stream是什么 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元 ...
- SpringCloud(二)注册服务提供者搭建
上文已经写了如何去搭建注册中心,仅有注册中心是远远不够的,所以我们需要注册到注册中心并提供服务的节点,这里称为注册服务提供者 前提 阅读上文,并成功搭建注册中心,环境无需改变 项目搭建 这里我们需要新 ...
- jquery 事件对象属性小结
使用事件自然少不了事件对象. 因为不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异, 导致我们很难跨浏览器使用事件对象. jQuery中统一了事件对象, 当绑定事件处理函数时, 会将jQue ...
- Hadoop面试链接
http://blog.csdn.net/haohaixingyun/article/details/52819457 http://blog.csdn.net/kingmax54212008/art ...
- indexof()函数
js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf, 成功,返回索引值,失败返回 -1. 转载: http://www.cnblogs.com/fishtreeyu/arc ...
- $this->success传递数据
public function index_edit_doExport() { $search=$_POST['id']; $this->success(U('Tongji/index_edit ...