2020牛客多校訓練第3場ABC
題目來源:2020牛客暑期多校訓練營(第三場)A-Clam and Fish
題目連結:https://ac.nowcoder.com/acm/contest/5668/A
題目大意:有n個階段,每個階段可能是4種狀態的一種。
1:沒魚沒飼料;
2:沒魚有飼料;
3:有魚沒飼料;
4:有魚有飼料。
對於每個階段:
我們可以用飼料做魚餌,
或者用魚餌釣魚,
或者在該狀態有魚的時候直接把魚抓起來。
解題思路:在3.4狀態是,我們必然是直接把有的魚抓起來就可以了。
在第1種狀態,如果我們手裡有魚餌就可以釣一條魚。
在第3種狀態,如果後面的1的數量比當前存的魚餌量多或等於,就繼續存魚餌,反之釣魚。
*/
#include<bits/stdc++.h> using namespace std; int main() { int t; scanf("%d",&t); for(int ii=1;ii<=t;ii++){ int n; scanf("%d",&n); string s; cin>>s; int s1[n+9],s0[n+9]; s1[n]=s0[n]=0; for(int i=n-1;i>=0;i--){ if(s[i]=='0')s0[i]=s0[i+1]+1; else s0[i]=s0[i+1]; } int food=0,fish=0; for(int i=0;i<n;i++){ if(s[i]=='0'){ if(food>=1)food--,fish++; } else if(s[i]=='1'){ if(s0[i]>=food)food++; else { if(food>=1)food--,fish++; else food++; } } else fish++; } printf("%d\n",fish); } return 0; }
/*
題目來源:2020牛客暑期多校訓練營(第三場)B-Classical String Problem
題目連結:https://ac.nowcoder.com/acm/contest/5668/B
題目大意:給你一個字串,n次操作。
m表示把前面k個字元挪後面,或把後面-k(k為負數)個挪前面。
a表示詢問,第k個字母是什麼。
解題思路:首位相連,看成一個環以後,所謂的挪動其實就是改動把那個字母看成頭,然後這題就沒了。
*/
#include<bits/stdc++.h> using namespace std; int main() { string s; cin>>s; s=" "+s; int l=s.size()-1;s[0]=s[l]; int n; cin>>n; int sum=0; for(int i=1;i<=n;i++){ getchar(); char c; int x; scanf("%c%d",&c,&x); if(x<0)x+=l; if(c=='A')printf("%c\n",s[(sum+x)%l]); else sum=(sum%l+x)%l; } return 0; }
/*
題目來源:2020牛客暑期多校訓練營(第三場)C-Operation Love
題目連結:https://ac.nowcoder.com/acm/contest/5668/C
題目大意:給出左手和右手的二維座標表示法。可能會旋轉平移,逆時針或順時針給出,不會改變大小,問是左手還是右手。
解題思路:先確定是逆時針還是順時針。然後找出長度為10的那條邊,看它接下來的邊的長度就可以確定是左手還是右手了。
在判斷是否相等的過程中需要注意精度問題,有時候結果可能是個小數,需要四捨五入到int型進行判斷
*/
#include<bits/stdc++.h> using namespace std; struct point { double x,y; point (){} point (double x,double y):x(x),y(y){} point operator + (point b){return point (x+b.x,y+b.y);} point operator - (point b){return point (x-b.x,y-b.y);} };typedef point Vector; double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;} point p[24]; double parea(int n) { double area=0; for(int i=0;i<n;i++) { area+=Cross(p[i],p[(i+1)%n]); } return area/2; } int dis(point a,point b){ return (int)(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))+0.5); } int main() { int n; cin>>n; while(n--){ double s; for(int i=0;i<20;i++){ cin>>p[i].x>>p[i].y; } p[21]=p[1]; if(parea(20)<0){ int i; for( i=0;i<20;i++){ if(dis(p[i],p[(i+1)%20])==9)break; } if(dis(p[(i+1)%20],p[(i+2)%20])==6)cout<<"right"<<endl; else cout<<"left"<<endl; } else{ int i; for( i=0;i<20;i++){ if(dis(p[i],p[(i+1)%20])==9) break; } if(dis(p[(i+1)%20],p[(i+2)%20])==6)cout<<"left"<<endl; else cout<<"right"<<endl; } } return 0; }