POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题
两题很有趣挺经典的蚂蚁问题。
1.n只蚂蚁以1cm/s的速度在长为L的竿上爬行,当蚂蚁爬到竿子的端点就会掉落。当两只蚂蚁相撞时,只能各自反向爬回去。对于每只蚂蚁,给出距离左端的距离xi,但不知道它的朝向,求所有蚂蚁落下竿子所需要的时间的最大值和最小值。
2.问题1的升级版:把问题1改为已知每只蚂蚁的左端距离和它的朝向,要求按输入顺序输出 t 秒后每只蚂蚁的位置和状态(掉出去,转向中,或者蚂蚁的朝向)。
1.POJ 1852 Ants
http://poj.org/problem?id=1852
思路:
很水的一题,因为以前做过问题2.so......
因为蚂蚁碰撞会反向,故我们可以直接看成是蚂蚁直接穿过去。
也就是说,这道题求解只需要独立的计算出每只蚂蚁到端点的时间即可。
最小时间只需要沿着靠近的一端走,最大时间则最远的一端。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a,L,n;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int min_ans=0,max_ans=0;
scanf("%d%d",&L,&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
min_ans=max(min_ans,min(L-a,a)); //选择小的一段走
max_ans=max(max_ans,max(L-a,a)); //选择长的一段走
//因为是计算总的时间故应取最大值。
}
printf("%d %d\n",min_ans,max_ans);
}
return 0;
}
2.UVA 10881 - Piotr's Ants
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822
思路:
《算法竞赛入门经典-训练指南》上的题。
半年前被虐个半死,今天是我把他虐个半死。
和问题1的差别在于要求出位置。
那么,同样的,每只蚂蚁碰撞后反向,所以每只蚂蚁的相对顺序不变。(突然想起“不撞南墙不回头”。。。。。。。)
所以我们根据一开始排个序,记录此时所有蚂蚁的序号,然后计算ts后的位置。(计算我们直接加上距离,你想,0s有一只向右的位置在x的,那么ts后一只向右的位置在x+t的,不管是不是一开始向右的那只还是和他碰撞的,我们可以看为穿过去)
接下来再次根据位置排序,将序号进行“还原”,即对应上原来在竿上的位置。
最后根据序号按顺序输出即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=10000+10;
int L,t,n;
int order[MAXN];
char string[][10]={"L","R","Turning"};
struct data
{
int id; //输入的顺序
int x; //位置
int dir; //方向 0 左 1右 2碰撞
bool operator<(const data &y)const{
return x<y.x;
}
}a[MAXN];
bool cmp(const data& x,const data&y)
{
return x.id<y.id;
}
int main()
{
int T,kase=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&L,&t,&n);
for(int i=0;i<n;i++)
{
char dir;
scanf("%d %c",&a[i].x,&dir);
if(dir=='L') a[i].dir=0;
else a[i].dir=1;
a[i].id=i;
}
//每只蚂蚁的相对次序是不变的,原来在左边的之后还会在左边。
sort(a,a+n); for(int i=0;i<n;i++)
{
order[i]=a[i].id;
if(a[i].dir==0)
a[i].x-=t;
else
a[i].x+=t;
}
//再次排序即可由最后的位置确定对应的输入序号(相对位置不变)
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
a[i].id=order[i];
if(a[i].x==a[i+1].x)
a[i+1].dir=a[i].dir=2;
}
a[n-1].id=order[n-1]; sort(a,a+n,cmp); //根据输入的顺序排序
printf("Case #%d:\n",kase++);
for(int i=0;i<n;i++)
{
if(a[i].x<0||a[i].x>L) //掉出去了
printf("Fell off\n");
else
printf("%d %s\n",a[i].x,string[a[i].dir]); //根据方向输出状态。
}
printf("\n");
}
return 0;
}
POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题的更多相关文章
- UVA.10881 Piotr's Ants (思维题)
UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...
- 思维题 UVA 10881 Piotr's Ants
题目传送门 /* 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 关键2:蚂蚁的相对位置不变 关键3:o ...
- cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁
1456. [UVa 10881,Piotr's Ants]蚂蚁 ★ 输入文件:Ants.in 输出文件:Ants.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述 ...
- UVA 10881 Piotr's Ants(等效变换 sort结构体排序)
Piotr's AntsTime Limit: 2 seconds Piotr likes playing with ants. He has n of them on a horizontal po ...
- [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]
"One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one ...
- UVA 10881 - Piotr's Ants【模拟+思维】
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 10881 Piotr's Ants 解题报告
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pa ...
- Uva 10881 Piotr’s Ants 蚂蚁
一根长度为 L 厘米的木棍上有 n 只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为 1 厘米/秒.当两只蚂蚁相撞时,二者同时调头(掉头用的时间忽略不计).给出每只蚂蚁的初始位置和朝向,计算 T 秒之后 ...
- uva 10881 - Piotr's Ants
这个题的突破点就在于蚂蚁不能够穿过对方,故相对位置不变: 另外,又可以把蚂蚁看成运动方向不变: 代码: #include<cstdio> #include<algorithm> ...
随机推荐
- 具体解释Hibernate中的二级缓存
1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...
- OpenCASCADE 麻花钻头造型实例分析
OpenCASCADE 麻花钻头造型实例分析 eryar@163.com Abstract. OpenCASCADE provides a simple twist drill bit modelin ...
- C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序
C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...
- HTML标签大全(常用)
转自:https://www.cnblogs.com/moije/p/6751624.html 文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种 ...
- 玲珑学院 1050 - array
1050 - array Time Limit:3s Memory Limit:64MByte Submissions:494Solved:155 DESCRIPTION 2 array is an ...
- BZOJ 1108 POI2007 天然气管道Gaz
题目大意:给定平面上的n个黑点和n个白点.一个黑点仅仅能和右下方的白点匹配.代价为曼哈顿距离,求最小权值完备匹配 STO OTZ STO OTZ STO OTZ ans=Σ(y黑-y白+x白-x黑) ...
- Android 多种方式正确的载入图像,有效避免oom
图像载入的方式: Android开发中消耗内存较多一般都是在图像上面.本文就主要介绍如何正确的展现图像降低对内存的开销,有效的避免oom现象. 首先我们知道我的获取图像的来源一般有三种源 ...
- android图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- 内存泄漏与指针悬挂&野指针介绍
内存泄漏概念:内存泄漏时指动态申请的内存空间没有正常释放,但是也不能继续使用的情况. 例如: char *ch1; ch1 = new char('A'); char = *ch2 = new cha ...
- CISP/CISA 每日一题 11
CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...