Description ![]() Piotr's Ants Time Limit: 2 seconds
Piotr likes playing with ants. He has n of them on a horizontal pole L cm long. Each ant is facing either left or right and walks at a constant speed of 1 cm/s. When two ants bump into each other, they both turn around (instantaneously) and start walking in opposite directions. Piotr knows where each of the ants starts and which direction it is facing and wants to calculate where the ants will end up T seconds from now. Input Output
Problemsetter: Igor Naverniouk Alternate solutions: Frank Pok Man Chu and Yury Kholondyrev Source Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 1. Algorithm Design :: General Problem Solving Techniques :: Examples Root :: Prominent Problemsetters :: Igor Naverniouk (Abednego) | ![]() |
Problem descriptions:
System Crawler 2014-08-17
![]() ![]() ![]() ![]() ![]() ![]() |
大白书的机智题。代码:(详细解析见大白书)
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10000+10;
struct ANT
{
int pos,dir,id;//pos代表位置,dir代表方向(-1:左,0:转向中,1:右。设置成-1,0,1,是为位置等的计算方便),id代表输入顺序
bool operator <(const ANT &a)const
{
return pos<a.pos;
}
}before[maxn],after[maxn];
char dirt[][10]={"L","Turning","R"};
int order[maxn];//输入的第i只蚂蚁是终态左数的第order[i]只蚂蚁
int main()
{
int kase,l,t,n,i,j,k;
char c;
scanf("%d",&kase);
for(k=1;k<=kase;k++)
{
scanf("%d%d%d",&l,&t,&n);
for(i=0;i<n;i++)
{
scanf("%d %c",&before[i].pos,&c);//注意这里的%d %c之间有空格,否则c读入的是空格
after[i].dir=before[i].dir=c=='R'?1:-1;//把方向看成不变,相当于“穿行而过”
before[i].id=i;
after[i].pos=before[i].pos+t*before[i].dir;
}
sort(before,before+n);
for(i=0;i<n;i++)
{
order[before[i].id]=i;
}
sort(after,after+n);
printf("Case #%d:\n",k);
for(i=0;i<n-1;i++)
if(after[i].pos==after[i+1].pos)
after[i].dir=after[i+1].dir=0;
for(i=0;i<n;i++)
{
int m=order[i];
if(after[m].pos>l||after[m].pos<0)
printf("Fell off\n");
else
{
int num=after[m].dir;
printf("%d %s\n",after[m].pos,dirt[num+1]);
}
}
printf("\n");
}
return 0;
}
总结:
还是挺有趣的题目。
附录:
#include<bits/stdc++.h>包含C++的全部头文件
参考博客:http://blog.kuoe0.tw/posts/2014/01/31/install-gnu-gcc-on-os-x-and-use-the-header-bits-stdcplusplus-h-and-policy-based-data-structure
做CF看见别人用这个函数,然后就能直接用vector,set,string那些函数了,摸不着头脑,感觉特神奇就百度了一下,才发现这个是C++版本升级,然后文件自带的,方便了程序员吧。不然每次都得敲那模板老长……
使用和平常的头文件一样,如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
#include<bits/stdc++.h>这个头文件包含以下等等C++中包含的所有头文件:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
等等……
不过在国内oj中,poj,hdu 不支持这个函数,这几个oj的编译器问题,其他国外的oj,还有台湾的oj都支持,CF,Topcoder也都支持。