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 快速排序法

    function quicksort(array $arr = array()){ $len = count($arr); if ($len > 1) { $key = $arr[0]; $l_ ...

  2. CF456B Fedya and Maths 找规律

    http://codeforces.com/contest/456/problem/B CF#260 div2 B Fedya and Maths Codeforces Round #260 B. F ...

  3. 使用DOS比较两个txt文件的差异

    将两个文件放入到同一个文件夹下 DOS下提供了FC命令 点击开始->运行->输入cmd,进入DOS下,进入指定目录,输入FC a.txt b.txt进行比较,下面会显示出之间的差异

  4. Jquery 操作IFrame

    使用jquery操作iframe 1. 内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe id ...

  5. [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站

    原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...

  6. PHP如何释放内存之unset销毁变量并释放内存详解

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...

  7. jquery mobile cannot be created in a document with origin 'null' and URL

    jquery mobile cannot be created in a document with origin 'null' and URL http://zhidao.baidu.com/lin ...

  8. bootstrap-dropdown

    功能:实现点击时下拉框显示 插件:dropdown.js 要点:dropdown功能往往用在导航栏.导航条上,用作标题显示.dropdown与<ul><li>标签搭配用. 以d ...

  9. 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5

    有网友说打开vs2010安装光盘,搜索 SSCERuntime_x86-chs.msi,重新安装之.于是果断搜索,发现SSCERuntime_x86-chs.msi,另外发现一个SSCEVSTools ...

  10. PL/sql developer连接数据库的问题以及oracle数据库中文乱码的问题

    今天第二次配置PL/sql developer,表示很蛋疼,昨天因为动了一个东西然后莫名其妙的就再也连接不了数据库,总是显示各种错误,我动的东西是因为中文会显示乱码,(因为我是用32位的PL/sql ...