題意:列車員要抓逃票的人。列車員在火車中來回巡邏,起點為cp,每分鐘移動一個車廂。逃票的人可以進入任一相鄰車廂,或者不動。火車停了的時候,逃票者下車,新的逃票者選擇一個車廂進入,問是否可以抓到這個人,何時抓到。
做法:貪心。如果列車員面對逃票者,逃票者和售票員往相同的方向跑,否則,就原地不動。放置時一般可以放在列車員背後,可是有特殊情況(程式中有)。列車員會轉身,是方向改變(以開始寫成像迴圈鏈表一樣的東西了...)。類比一下就好了.這種小規模題,直接類比
#include <iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;char mov[200];int cp,sp,dre,n;bool test(void){ for(int i=sp;i!=n-1&&i!=0;i=(i+dre+n)%n) if(i==cp)return 1; return 0;}int main(void){ bool yes=0; char ord[15]; scanf("%d%d%d",&n,&sp,&cp);getchar(); gets(ord); if(strcmp(ord,"to head")==0)dre=-1; else dre=1; scanf("%s",mov); if(cp==sp) { printf("Controller 0\n"); return 0; } cp--;sp--; if(test())yes=1; else yes=0; for(int i=0;mov[i];i++) { if(mov[i]=='1') { cp=(cp+dre+n)%n; if(cp==0||cp==n-1)dre=-dre; if(dre==-1&&cp==n-1)sp=0; else if(dre==1&&cp==0)sp=n-1; else sp=(cp-dre+n)%n; if(test())yes=1; else yes=0; continue; } cp=(cp+dre+n)%n; if(cp==0||cp==n-1)dre=-dre; if(cp==0&&dre==1||cp==n-1&&dre==-1) { if(test())yes=1; else yes=0; } if(yes)continue; if(sp!=0&&sp!=n-1)sp=(cp+dre+n)%n; if(cp==sp) { printf("Controller %d\n",i+1); return 0; } } printf("Stowaway\n"); return 0;}