Greedy:Linear world(POJ 2674)

题目大意:一些人生活在线性世界中,到达线性世界两端就会消失,两个人的前进方向有两个,相遇会改变各自相遇方向,求最后一个人掉下的人的名字和时间。
其实这一题就是弹性碰撞的模型,所谓弹性碰撞的模型是两个物体相碰后会改变方向,但是可以看成是各自擦身而过,这个模型可以很快速求解与端点的问题
但是这一题还问你一个问题,就是你要找到这个人的名字,这个我一开始,没有想到,只能参考一下别人的代码了
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)的更多相关文章
- POJ 2674 Linear world
POJ 2674 Linear world 题目大意: 一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的时间和名字. 注意两点: 相撞可视为擦肩而过,蚂蚁们不管掉 ...
- POJ 2674 Linear world(弹性碰撞)
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4426 Accepted: 1006 Desc ...
- POJ 2674
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2448 Accepted: 564 Descr ...
- Greedy:Cow Acrobats(POJ 3045)
牛杂技团 题目大意:一群牛想逃跑,他们想通过搭牛梯来通过,现在定义risk(注意可是负的)为当前牛上面的牛的总重量-当前牛的strength,问应该怎么排列才能使risk最小? 说实话这道题我一开始给 ...
- Greedy:Graveyard Design(POJ 2100)
墓地 题目大意,给定一个整数,要你找出他的平方和组合 太简单了....不过一开始我储存平方和想降低时间,后来发现会超内存,直接用时间换空间了,游标卡尺法 #include <iostream&g ...
- Greedy:Bound Found(POJ 2566)
神奇密码 题目大意:就是给你一个数组,要你找出连续的数的绝对值的和最接近t的那一串,并且要找出数组的上界和下界的下标,并显示他们的和 因为这一题的数有正有负,所以必须要先把和求出来,然后排序,然 ...
- Greedy:Yogurt factory(POJ 2393)
酸奶工厂 题目大意:酸奶工厂每个星期都要制造酸奶,成本每单位x,然后每个星期要生产y,然后酸奶厂有个巨大的储存室,可以无限储存酸奶,而且酸奶的品质不会变坏,每天储存要每单位花费S,求最小的成本. 简直 ...
- Greedy:Stall Reservations(POJ 3190)
牛挤奶 题目大意:一群牛很挑剔,他们仅在一个时间段内挤奶,而且只能在一个棚里面挤,不能与其他牛共享地方,现在给你一群牛,问你如果要全部牛都挤奶,至少需要多少牛棚? 这一题如果把时间区间去掉,那就变成装 ...
- Greedy:Radar Installation(POJ 1328)
装雷达 题目大意,就是令在海岸线的(直线)一边是海(y>0),另一边是陆地(y<=0),在海岸线上装雷达,雷达可以覆盖的范围为d,海上有岛,(x,y),问你应该怎么装雷达,才能做到技能雷达 ...
随机推荐
- Tomcat 6.0 简介
本片翻译来自:http://tomcat.apache.org/tomcat-6.0-doc/introduction.html 介绍 无论是开发者还是tomcat管理员在使用前都需要了解一些必要的信 ...
- Windows疑难杂症之开机无法显示桌面。
开机无法显示桌面可能有以下两种情况. 1.系统故障或病毒引起explorer.exe无法加载启动. 2.注册表故障造成默认的值不是explorer.exe.(可能是安装了某些软件造成此问题) 3,某开 ...
- 繁华模拟赛day8 字典序
/* 这个题要我们求一个字典序,字符串给出的顺序,会对字母的字典序前后相对顺序进行限定,如何用来表示这种限定,我们注意到这种一个之后接着一个,只有先输出他前面的才能输出他,很明显就是拓扑排序,最小方案 ...
- C#深入浅出 修饰符(二)
1.函数参数前的修饰符 params ,ref ,out params修饰的数据类型只能数组,用于参数不固定时:且此参数位于所有形式参数的最后: public static int GetMax(pa ...
- nyoj 171 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的“KK”非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不断变换和绚丽多彩的 ...
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现
一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...
- 全文检索引擎Solr系列——整合MySQL、MongoDB
MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...
- Interleaving String leetcode
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...
- 移动端rem切图
1.为什么用rem 根据屏幕大小,自动调整大小 2.如何使用rem 分以下几步 a.用ps把设置稿弄成640px或者750px的(记得等比例缩放) b.调试时记得把浏览器默认最小字体设置为最小.手机端 ...
- [POJ2892]Tunnel Warfare
[POJ2892]Tunnel Warfare 试题描述 During the War of Resistance Against Japan, tunnel warfare was carried ...