北邮OJ 102. 最远距离 北邮2012网研院复试上机题
102. 最遠(yuǎn)距離
時(shí)間限制1000 ms???? 內(nèi)存限制 65536 KB????題目描述
正義的伙伴褋祈和葬儀社的機(jī)器人Fuyuneru正在被邪惡的GHQ部隊(duì)追殺。眼看著快要逃不掉了,祈就把重要的東西塞到了機(jī)器人體內(nèi),讓它先跑,自己吸引火力。
假設(shè)Fuyuneru帶上東西開始逃跑時(shí)所處的點(diǎn)為原點(diǎn),朝向?yàn)檎薄2倏vFuyuNeru的指令有如下四種:
right X: X是1-359之間的整數(shù),Fuyuneru的前進(jìn)方向順時(shí)針轉(zhuǎn)X度。
left X: X是1-359之間的整數(shù),Fuyuneru的前進(jìn)方向逆時(shí)針轉(zhuǎn)X度。
forward X: X是整數(shù)(0<=X<=1000),Fuyuneru向當(dāng)前朝向前進(jìn)X米。
backward X: X是整數(shù)(0<=X<=1000),Fuyuneru向當(dāng)前朝向后退X米。
現(xiàn)在祈向Fuyuneru體內(nèi)輸入了N(1<=N<=50)個(gè)這樣的指令。可是由于此前Fuyuneru被GHQ部隊(duì)擊中,它出了一點(diǎn)小問題:這N個(gè)指令執(zhí)行的順序是不確定的。
問:Fuyuneru最遠(yuǎn)可能逃出多遠(yuǎn)?
即,Fuyuneru在執(zhí)行完N條指令之后,距離原點(diǎn)最遠(yuǎn)的可能距離是多少?
輸入格式
第一行是一個(gè)整數(shù)T,代表測試數(shù)據(jù)有T組。
每組測試數(shù)據(jù)中,第一行是一個(gè)整數(shù)N,代表指令有N條;
隨后緊跟N行,每一行代表一個(gè)指令(格式保證是上述四種中的一種,數(shù)據(jù)保證合法)
輸出格式
對于每組數(shù)據(jù),輸出一行:最遠(yuǎn)的可能逃亡距離,精確到小數(shù)點(diǎn)后3位。
輸入樣例
3 3 forward 100 backward 100 left 90 4 left 45 forward 100 right 45 forward 100 6 left 10 forward 40 right 30 left 10 backward 4 forward 4輸出樣例
141.421 200.000 40.585?
最遠(yuǎn)距離為,向前走之后,找到一個(gè)向后走的時(shí)候向前走的方向盡可能處在180°上的方向。
比如,向前走100米,然后向右轉(zhuǎn)180°,然后向后走100米,然后隨意旋轉(zhuǎn),這樣就距離起點(diǎn)最遠(yuǎn),200米。
所以問題轉(zhuǎn)化為,找到一種旋轉(zhuǎn)組合,使得盡可能旋轉(zhuǎn)180°。
然后利用a^2+b^2-2abcosC=c^2求出最遠(yuǎn)距離
?
對于求出旋轉(zhuǎn)角度組合,設(shè)向右為正,假設(shè)輸入順序:60°,30°,10°,等等
我們讀入60°的時(shí)候,從(0+60°)-(360°+60°)開始枚舉,首先標(biāo)記60°為訪問過,vis[60]=1,即我們可以旋轉(zhuǎn)出60°這個(gè)角度來,然后訪問余下的角度,如果訪問過x°,if(vis[x]==1),那么我們標(biāo)記x+60°為也訪問過,即x+60°這個(gè)角度也是可以被訪問到的,vis[x+60]=1。
比如,當(dāng)我們按順序第二個(gè)讀入30°的時(shí)候,vis[30]=1,在(0+60°)-(360°+60°)枚舉的過程中,枚舉到30°+30°的時(shí)候,因?yàn)関is[30+30]==1,所以,vis[60+30]=1。
然后我們只要不斷更新,最接近180的vis[],然后計(jì)算即可。
?
?
#include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<set> #define Pi acos(-1.0) using namespace std;double dis(double a,double b,double Ang) {return sqrt(a*a+b*b-2*a*b*cos(Ang/180*Pi)); }int main() {int i,j,t,n,vis[360],val,minA,rec[360];//minA是和180°最接近的角度,vis用來記錄是否可以到達(dá)該角度,rec用來記錄當(dāng)前角度是否被使用過multiset<int>turn; //來存旋轉(zhuǎn)角度,向右為正int up,down; //前進(jìn)和后退string s;for(cin>>t;t--;){turn.clear();up=down=0;memset(vis,0,sizeof vis);for(cin>>n;n--;){cin>>s>>val;if(s=="forward")up+=val;else if(s=="backward")down+=val;else{if(s=="right")turn.insert(val);else turn.insert(360-val);}}multiset<int>::iterator it;vis[0]=1;for(it=turn.begin();it!=turn.end();it++){//printf("it:%d\n",*it);memset(rec,0,sizeof rec);for(i=0;i<360;i++){int tmp=(i+*it)%360;if(rec[i]==0&&(vis[i])&&vis[tmp]==0){vis[tmp]=rec[tmp]=1;}}}minA=180; //防止沒有旋轉(zhuǎn)指令for(i=0;i<360;i++)if(vis[i])if(abs(180-i)<minA)minA=abs(180-i);//printf("minA:%d\n",minA);printf("%.3lf\n",dis(up,down,180-minA));}return 0; }
?
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的北邮OJ 102. 最远距离 北邮2012网研院复试上机题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北邮OJ 255. 奇偶求和-软件14
- 下一篇: 关于KD树(未完)