UvaLive6662

PDF题目

题意:给出隧道长度L,蚂蚁数量N,各蚂蚁位置Pi、前进方向Di,都为整数(前进方向为L或R),蚂蚁速度为1cm每秒,两蚂蚁若在整数点相遇则都反向,若不在整数点相遇则继续向前。求最后一个走出隧道的蚂蚁的编号。蚂蚁按编号1~n给出,隧道头尾位置为0和L。

题解:

模拟。

当然我们不用模拟蚂蚁实时行走,我们只用算一算蚂蚁什么时候会撞到。

给蚂蚁建个结构体,包括编号、位置、方向,方便以后操作。因为蚂蚁起始位置为整数,也总会在整数点相遇,所以所有数据都可以整数存储。

先给蚂蚁排个序,第一关键字位置,第二关键字方向,排完序后位置数值越小的在数组越前面,位置相同的L在R的前面。然后我们对每个蚂蚁进行研究,向它前进的方向找第一个与它反向而且会和它在整数点相遇的蚂蚁,跳出。记录其中最小的整数点相撞时间mint,判完所有蚂蚁后,让蚂蚁们走过mint,然后排序,将现在相同位置的蚂蚁转向。

重复上面的操作,直到没有蚂蚁会相撞。此时计算各蚂蚁出局时间,找出最后的蚂蚁,输出它的编号和总时间。

题目保证蚂蚁都会出去,不会撞死在里面。

题目没说超过2个蚂蚁撞到一起会怎么样,我是也考虑了,全部转向,不懂有没有这样的数据。

 //#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,x,n) for(int i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1biao.out","w",stdout) const int inf=0x3f3f3f3f;
const int maxn=; struct ant {
int num;
char d;
int p;
}; int n,l;
ant a[maxn]; bool operator <(ant x,ant y) {
if(x.p!=y.p)return x.p<y.p;
else return x.d<y.d;
} void del(ant a[],const int &i,int &m) {
for(int j=i; j<m-; j++)
a[j]=a[j+];
m--;
} void check(int m) {
for(int q=; q<m; q++)
printf("%d.(%c,%d) ",a[q].num,a[q].d,a[q].p);
puts("");
} int main() {
int i,j,k;
while(scanf("%d%d",&n,&l)!=EOF) {
if(n== && l==)break; for(i=; i<n; i++) {
scanf(" %c%d",&a[i].d,&a[i].p);
a[i].num=i+;
} sort(a,a+n);
int m=n;
int time=;
while(m>=) {///还剩蚂蚁
int mint=inf;
for(i=; i<m; i++)
if(a[i].d=='L') {
for(j=i-; j>=; j--)
if(a[j].d=='R' && ((a[j].p+a[i].p)&)==) {
int tt=abs(a[j].p-a[i].p)/;
if(tt<mint) mint=tt;///记录会撞上的最小时间
break;
}
} else ///a[i].d=='R'
for(j=i+; j<m; j++)
if(a[j].d=='L' && ((a[j].p+a[i].p)&)==) {///(..&1)==0,省括号会逗,&优先级很低的样子
int tt=abs(a[j].p-a[i].p)/;
if(tt<mint) mint=tt;
break;
}
if(mint!=inf) {///有蚂蚁会撞上
for(i=; i<m; i++)///让蚂蚁走过mint的时间撞上
if(a[i].d=='L')a[i].p-=mint;
else a[i].p+=mint;
sort(a,a+m);///排序,将相同位置的蚂蚁挪到一起
for(i=m-; i>=; i--)///删掉走出去的蚂蚁
if((a[i].p<) || (a[i].p>l)) del(a,i,m);
i=;
while(i<m) {///把位置相同的蚂蚁全部转个向
if(a[i].p==a[i-].p&& a[i].d!=a[i-].d) {
j=i+;
while(j<m&& a[j].p==a[i].p)j++;
for(k=i-; k<j; k++)
if(a[k].d=='L')a[k].d='R';
else a[k].d='L';
i=j+;
} else i++;
}
// check(m);
sort(a,a+m);///排个序,让位置相同的蚂蚁往左的在左边,往右的在右边,不会撞
time+=mint;///统计经过的时间
} else { ///没蚂蚁会相撞了,找出最晚跑出去的蚂蚁
int maxi=-;
int maxt=-;
for(i=; i<m; i++) {
if(a[i].d=='L' && a[i].p>=maxt) {
maxt=a[i].p;
maxi=i;
} else if(a[i].d=='R' && (l-a[i].p>maxt)) {
maxt=l-a[i].p;
maxi=i;
}
// printf("%f,%d ",maxt,maxi);
}
printf("%d %d\n",maxt+time,a[maxi].num);
m=;
}
}
}
return ;
}

UvaLive6662 The Last Ant 模拟的更多相关文章

  1. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  2. POJ 1696 Space Ant --枚举,模拟,贪心,几何

    题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去 ...

  3. CygWin模拟Linux环境进行Ant批量打包

    运行环境:Windows7 + Cygwin + ant 第一种:有源码 这种方式比较 简单.利用ant打包.直接shell脚本修改 配置渠道号的文件.我们目前是用的umeng的.在AndroidMa ...

  4. 一.Jmeter+Ant+Jenkins搭建持续集成接口性能自动化测试

    微创新作品信息 1)微创新作品描述 A.为什么诞生: 1. 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换, ...

  5. 浅谈Winform事件的实现以及模拟其事件的实现(附实现源码)

    当我们初学Winform的时候被其神奇的事件功能所吸引,当点击一个按钮时,便会跳到我们所写的点击方法当中去.然而这并不符合我们对方法的理解,究竟.net在后面帮助我们实现了什么.我们怎样模拟其事件的实 ...

  6. python 模拟登陆,请求包含cookie信息

    需求: 1.通过GET方法,访问URL地址一,传入cookie参数 2.根据地址一返回的uuid,通过POST方法,传入cooki参数 实现思路: 1.理解http的GET和POST差别 (网上有很多 ...

  7. 利用ant脚本 自动构建svn增量/全量 系统程序升级包

    首先请允许我这样说,作为开发或测试,你一定要具备这种 本领.你可以手动打包.部署你的工程,但这不是最好的方法.最好的方式就是全自动化的方式.开发人员提交了代码后,可以自动构建.打包.部署到测试环境. ...

  8. Packets(模拟 POJ1017)

    Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47750 Accepted: 16182 Description ...

  9. 不会用ant打包、部署项目的工程师,不是一个好程序员(测试)

    副标题:利用ant脚本 自动构建svn增量/全量 系统程序升级包 首先请允许我这样说,作为开发或测试,你一定要具备这种本领.你可以手动打包.部署你的工程,但这不是最好的方法.最好的方式就是全自动化的方 ...

随机推荐

  1. 【poj3017】 Cut the Sequence

    http://poj.org/problem?id=3017 (题目链接) 题意 给出一个数列要求将它分割成许多块,每块的数的和不超过m,要求每块中最大的数之和最小. Solution 这道题真的很不 ...

  2. sublime编写markdown文件中Ctrl+B的作用

    今天,手残,用markdown编辑是按了Ctrl+B,结果发现直接在同一文件夹目录下编译生成了html文件,之前都是Alt+m,可以直接预览,可是后来由于系统更新还是什么,Alt+m只会在用户目录(而 ...

  3. 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  4. codevs 1013 求先序排列(二叉树遍历)

    传送门 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). Input 两个字符串,分别是中序和后序(每行一个) Outp ...

  5. FZU 1752 A^B mod C(快速加、快速幂)

    题目链接: 传送门 A^B mod C Time Limit: 1000MS     Memory Limit: 65536K 思路 快速加和快速幂同时运用,在快速加的时候由于取模耗费不少时间TLE了 ...

  6. JS, Node.js, npm简介

    序 听过JS,听过Node,也听过Node.js,还听过npm,然而并不是很清楚的知道都代表什么,这两天调接口,然后前端同学很忙,就自己把前端代码拿过来跑了,也趁机了解一下这几个概念,下边做个小的总结 ...

  7. java连接数据源-读取tomcat数据源配置

    读取数据源配置,获取连接 1.配置数据源 D:\apache-tomcat-7.0.70\conf\context.xml <Resource name="jdbc/news" ...

  8. ARPSpoofing教程(四) - 捕获并分析数据包

    本程序的主要目标是展示如何解析所捕获的数据包的协议首部. 这个程序可以称为UDPdump,打印一些网络上传输的UDP数据的信息. 1: #include"pcap.h" 2: ty ...

  9. Linux下python升级至2.7

    1. 下载python源码包 wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz2. 解压 tar -xjf Python-2.7 ...

  10. CSS3动画(性能篇)

    写在前面 高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量.功耗与流畅度. 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额 ...