UvaLive6662 The Last Ant 模拟
2014-08-08 20:49
411 查看
UvaLive6662
PDF题目
题意:给出隧道长度L,蚂蚁数量N,各蚂蚁位置Pi、前进方向Di,都为整数(前进方向为L或R),蚂蚁速度为1cm每秒,两蚂蚁若在整数点相遇则都反向,若不在整数点相遇则继续向前。求最后一个走出隧道的蚂蚁的编号。蚂蚁按编号1~n给出,隧道头尾位置为0和L。
题解:
模拟。
当然我们不用模拟蚂蚁实时行走,我们只用算一算蚂蚁什么时候会撞到。
给蚂蚁建个结构体,包括编号、位置、方向,方便以后操作。因为蚂蚁起始位置为整数,也总会在整数点相遇,所以所有数据都可以整数存储。
先给蚂蚁排个序,第一关键字位置,第二关键字方向,排完序后位置数值越小的在数组越前面,位置相同的L在R的前面。然后我们对每个蚂蚁进行研究,向它前进的方向找第一个与它反向而且会和它在整数点相遇的蚂蚁,跳出。记录其中最小的整数点相撞时间mint,判完所有蚂蚁后,让蚂蚁们走过mint,然后排序,将现在相同位置的蚂蚁转向。
重复上面的操作,直到没有蚂蚁会相撞。此时计算各蚂蚁出局时间,找出最后的蚂蚁,输出它的编号和总时间。
题目保证蚂蚁都会出去,不会撞死在里面。
题目没说超过2个蚂蚁撞到一起会怎么样,我是也考虑了,全部转向,不懂有没有这样的数据。
View Code
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=22; 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-1; j++) a[j]=a[j+1]; m--; } void check(int m) { for(int q=0; 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==0 && l==0)break; for(i=0; i<n; i++) { scanf(" %c%d",&a[i].d,&a[i].p); a[i].num=i+1; } sort(a,a+n); int m=n; int time=0; while(m>=1) {///还剩蚂蚁 int mint=inf; for(i=0; i<m; i++) if(a[i].d=='L') { for(j=i-1; j>=0; j--) if(a[j].d=='R' && ((a[j].p+a[i].p)&1)==0) { int tt=abs(a[j].p-a[i].p)/2; if(tt<mint) mint=tt;///记录会撞上的最小时间 break; } } else ///a[i].d=='R' for(j=i+1; j<m; j++) if(a[j].d=='L' && ((a[j].p+a[i].p)&1)==0) {///(..&1)==0,省括号会逗,&优先级很低的样子 int tt=abs(a[j].p-a[i].p)/2; if(tt<mint) mint=tt; break; } if(mint!=inf) {///有蚂蚁会撞上 for(i=0; 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-1; i>=0; i--)///删掉走出去的蚂蚁 if((a[i].p<0) || (a[i].p>l)) del(a,i,m); i=1; while(i<m) {///把位置相同的蚂蚁全部转个向 if(a[i].p==a[i-1].p&& a[i].d!=a[i-1].d) { j=i+1; while(j<m&& a[j].p==a[i].p)j++; for(k=i-1; k<j; k++) if(a[k].d=='L')a[k].d='R'; else a[k].d='L'; i=j+1; } else i++; } // check(m); sort(a,a+m);///排个序,让位置相同的蚂蚁往左的在左边,往右的在右边,不会撞 time+=mint;///统计经过的时间 } else { ///没蚂蚁会相撞了,找出最晚跑出去的蚂蚁 int maxi=-1; int maxt=-1; for(i=0; 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=0; } } } return 0; }
View Code
相关文章推荐
- UvaLive 6662 The Last Ant 模拟
- UVALive6662 The Last Ant
- UVA 6662 The Last Ant(模拟退火)
- LA 6662 —— The Last Ant(模拟)
- UVALive 5695 -The Last Puzzle -区间dp
- UVALive 6581 What does the fox say? (模拟)
- The Same Game UVA 758/Uvalive 5423 大模拟 求最大联通块并清除
- POJ1218 HDU1337 ZOJ1350 UVALive2557 THE DRUNK JAILER【模拟】
- UVA694 UVALive5466 The Collatz Sequence【模拟】
- UVALive 6680 Join the Conversation (模拟)
- UVALive 7146 Defeat the Enemy(模拟)
- UVALive 6465 Islands in the Data Stream 暴力模拟
- UVa 573 The Snail (模拟)
- UVALive 3637 The Bookcase
- UVa 131 The Psychic Poker Player (枚举&模拟好题)
- UVALive 3942 Remember the Word(trie + dp)
- UVALive 3181 Fixing the Great Wall
- UVALive 2197 Paint the Roads(费用流)
- uvalive 3523 Knights of the Round Table 圆桌骑士(强连通+二分图)
- uva 573 The Snail(模拟)