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; }