Linear world

  题目大意:一些人生活在线性世界中,到达线性世界两端就会消失,两个人的前进方向有两个,相遇会改变各自相遇方向,求最后一个人掉下的人的名字和时间。

  其实这一题就是弹性碰撞的模型,所谓弹性碰撞的模型是两个物体相碰后会改变方向,但是可以看成是各自擦身而过,这个模型可以很快速求解与端点的问题

  但是这一题还问你一个问题,就是你要找到这个人的名字,这个我一开始,没有想到,只能参考一下别人的代码了

  http://www.cnblogs.com/gtarcoder/p/4908715.html

  人的名字坐标 = 最晚消失对应人的坐标+这个人的前进方向的所在的与此人前进方向相反的人的个数

  现在的问题是:为什么可以这么找?

  其实我们可以这样看,假设只有一个P,则最晚消失的人将不会受到任何改变。

  

  我们可以从上图中发现,设时间最晚消失的人一开始是P方向,如果不存在N方向,则最晚消失的人就是最晚消失对应位置,如果不存在P,只存在N,则最晚消失对应的人要往前进一个坐标,如果有两个则前进两个,当P和N同时存在,结论同时成立。所以我们只用找与前进方向相反的人的个数,就可以找到最晚消失的那个人的位置。

  这个应该是数论问题,但是想了很久还是没有想到有什么好的解释,以后找到就更新一下

 #include <iostream>
#include <algorithm>
#include <functional>
#include <math.h> using namespace std; struct _set
{
bool dir;
double pos;
char name[];
bool operator < (const _set&x)const
{
return pos < x.pos;
}
}inhabitants[], exchange[]; int Search_Name(const int, const int);
void Merge_Sort(const int, const int);
void Merge(const int, const int, const int); int main(void)
{
//最大距离位置距离方向有关
double length, rate, max_time;
int sum_people, max_pos, last_stop_pos;
char tmp_dir[];
while (~scanf("%d", &sum_people))
{
if (sum_people == ) break;
scanf("%lf%lf", &length, &rate);
getchar();
for (int i = ; i < sum_people; i++)
{
scanf("%s %lf %s", tmp_dir, &inhabitants[i].pos, inhabitants[i].name);
inhabitants[i].dir = tmp_dir[] == 'p' || tmp_dir[] == 'P' ? : ;
}
sort(inhabitants, inhabitants + sum_people);
//Merge_Sort(0, sum_people - 1);
max_time = -;
for (int i = ; i < sum_people; i++)//找到最大的位置
{
if (inhabitants[i].dir == )
{
if ((length - inhabitants[i].pos) / rate> max_time)//正方向
{
max_time = (length - inhabitants[i].pos) / rate;
max_pos = i;
}
}
else
{
if (inhabitants[i].pos / rate > max_time)//反方向
{
max_time = inhabitants[i].pos / rate;
max_pos = i;
}
}
}
last_stop_pos = Search_Name(max_pos, sum_people);
printf("%13.2lf %s\n", floor( * max_time) / 100.0, inhabitants[last_stop_pos].name);
}
return EXIT_SUCCESS;
} int Search_Name(const int max_pos,const int sum_people)
{
int dir_count = ;
if (inhabitants[max_pos].dir == )
{
for (int i = max_pos + ; i < sum_people; i++)
if (inhabitants[i].dir == )
dir_count++;
return max_pos + dir_count;
}
else
{
for (int i = ; i < max_pos; i++)
if (inhabitants[i].dir == )
dir_count++;
return max_pos - dir_count;
}
} /*void Merge_Sort(const int left,const int right)
{
int mid = (left + right) / 2;
if (right > left)
{
Merge_Sort(left, mid);
Merge_Sort(mid + 1, right);
Merge(left, mid + 1, right);
}
} void Merge(const int left, const int mid, const int right)
{
int pos1 = left, pos2 = mid, l_end = mid - 1, r_end = right, pos_exchange;
for (pos_exchange = left; pos1 <= l_end && pos2 <= r_end;)
{
if (inhabitants[pos1].pos < inhabitants[pos2].pos)
exchange[pos_exchange++] = inhabitants[pos1++];
else
exchange[pos_exchange++] = inhabitants[pos2++];
}
while (pos1 <= l_end)
exchange[pos_exchange++] = inhabitants[pos1++];
while (pos2 <= r_end)
exchange[pos_exchange++] = inhabitants[pos2++];
for (int i = left; i <= right; i++)
inhabitants[i] = exchange[i];
}*/

  

  最后很多人在讨论板说sort会卡时间,我自己试了一下觉得还可以啊,657ms刷掉3000ms的题,编了个Merge_Sort,直接变1200ms.....

  然后就是这一题,我醉了,P还分大小写,一开始没看题,醉了,欧洲人都喜欢这样玩的吗?

Greedy:Linear world(POJ 2674)的更多相关文章

  1. POJ 2674 Linear world

    POJ 2674 Linear world 题目大意: 一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的时间和名字. 注意两点: 相撞可视为擦肩而过,蚂蚁们不管掉 ...

  2. POJ 2674 Linear world(弹性碰撞)

    Linear world Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4426   Accepted: 1006 Desc ...

  3. POJ 2674

    Linear world Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2448   Accepted: 564 Descr ...

  4. Greedy:Cow Acrobats(POJ 3045)

    牛杂技团 题目大意:一群牛想逃跑,他们想通过搭牛梯来通过,现在定义risk(注意可是负的)为当前牛上面的牛的总重量-当前牛的strength,问应该怎么排列才能使risk最小? 说实话这道题我一开始给 ...

  5. Greedy:Graveyard Design(POJ 2100)

    墓地 题目大意,给定一个整数,要你找出他的平方和组合 太简单了....不过一开始我储存平方和想降低时间,后来发现会超内存,直接用时间换空间了,游标卡尺法 #include <iostream&g ...

  6. Greedy:Bound Found(POJ 2566)

       神奇密码 题目大意:就是给你一个数组,要你找出连续的数的绝对值的和最接近t的那一串,并且要找出数组的上界和下界的下标,并显示他们的和 因为这一题的数有正有负,所以必须要先把和求出来,然后排序,然 ...

  7. Greedy:Yogurt factory(POJ 2393)

    酸奶工厂 题目大意:酸奶工厂每个星期都要制造酸奶,成本每单位x,然后每个星期要生产y,然后酸奶厂有个巨大的储存室,可以无限储存酸奶,而且酸奶的品质不会变坏,每天储存要每单位花费S,求最小的成本. 简直 ...

  8. Greedy:Stall Reservations(POJ 3190)

    牛挤奶 题目大意:一群牛很挑剔,他们仅在一个时间段内挤奶,而且只能在一个棚里面挤,不能与其他牛共享地方,现在给你一群牛,问你如果要全部牛都挤奶,至少需要多少牛棚? 这一题如果把时间区间去掉,那就变成装 ...

  9. Greedy:Radar Installation(POJ 1328)

    装雷达 题目大意,就是令在海岸线的(直线)一边是海(y>0),另一边是陆地(y<=0),在海岸线上装雷达,雷达可以覆盖的范围为d,海上有岛,(x,y),问你应该怎么装雷达,才能做到技能雷达 ...

随机推荐

  1. php怎么获取mac地址?

    如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...

  2. 微信获取nickname中存在Emoji导致保存为空问题的解决

    微信开发时候,有些用户使用Emoji表情作为用户昵称,导致数据库保存昵称时候不识别导致昵称为空,现在提出以下解决方案: /** +----------------------------------- ...

  3. jquery隐藏按钮

    $(function () { jhbs = getQueryStringByName('jhbs'); shhbs = getQueryStringByName('shhbs'); if (shhb ...

  4. ASP.NET原理分析

    ASP.NET请求与处理全过程分析 1.用户向服务器的某IP端口发送请求,此端口通过Http.sys来管理,请求报文被Http.sys接收,Http.sys在注册表中找能处理这个请求类型的应用程序,最 ...

  5. CSS vertical-align 属性

    定义和用法 vertical-align 属性设置元素的垂直对齐方式.该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐

  6. 滑雪 why WA

    滑雪 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 587  Solved: 219 Description 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获 ...

  7. java之String

    一.构造器 package com.string; import java.io.UnsupportedEncodingException; import java.nio.charset.Chars ...

  8. memcache安装

    windows下访问 http://pecl.php.net/package/memcache/3.0.8/windows 下载对应版本memcache的dll文件添加到php目录ext下 PHP.i ...

  9. LAMP平台部署及应用

    环境:http://www.cnblogs.com/zzzhfo/p/5925786.html  http://www.cnblogs.com/zzzhfo/p/5934630.html 1.LAMP ...

  10. 【转】MySQL数据类型和常用字段属性总结

    来源:http://www.jb51.net/article/55853.htm 这里先总结数据类型.MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. ...