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

  

posted @ 2020-07-25 11:02  一只球球  阅读(117)  评论(0编辑  收藏  举报