• 2020牛客暑期多校训练营(第三场)


    A.Clam and Fish

    • 记录答案为ans,很明显当为3、4的时候,捕鱼即可,ans++,当为0的时候,
      判断是否有做好的鱼饵,有鱼饵的话直接钓鱼,ans++,此时鱼饵数也对应减一,
      为1时,有蛤,故做一个鱼饵,鱼饵数+1。
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <map>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <stdlib.h>
    #include <time.h>
    #include <iomanip>
    #define S(X) scanf("%d",&(X))
    #define SS(X, Y) scanf("%d%d",&(X),&(Y))
    #define SSS(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
    #define SL(X) scanf("%lld",&(X))
    #define SLL(X, Y) scanf("%lld%lld",&(X),&(Y))
    using namespace std;
    typedef double db;
    typedef long long ll;
    const int mod = 998244353;
    const int maxn=2e6+100;
    const double pi=acos(-1);
    int main()
    {
    	#ifdef ONLINE_JUDGE
        #else
            freopen(".vscode/in.txt","r",stdin);
        #endif
        int t;
        S(t);
        while(t--)
        {
            int n;
            S(n);
            char s[maxn];
            scanf("%s",s);
            int er=0,ans=0,make=0;;
            for(int i=0;i<n;i++)
            {
                if(s[i]=='0')
                {
                    if(make)
                    {
                        ans++;make--;
                    }
                }
                else if(s[i]=='1')
                {
                        make++;
                }
                else 
                    ans++;
               // cout<<"i="<<i<<"  er="<<er<<"  make="<<make<<"  ans="<<ans<<endl;
            }
            printf("%d\n",ans+make/2);
        }
    	return 0;
    }
    
    

    B.Classical String Problem

    • 这个直接将字符串首尾相连组成一个环即可,我们可以定义一个指针ops,这个指针就是更改后的字符串的初始位置,令初始值为0,当我们查询字符串x位置的字符时输出str[(ops+x-1+len)%len]即可,当x>0时,我们将指针顺时针走x个,即将一开始的字符串的初始位置+x,这样前x个就到字符串后面去了,这个位置就是更改后的字符串位置,因为可能会超过len的长度,因此要(ops+x+len)%len,当x为负的时候,同理ops也要加上x,因为x是负的,直接加即可,又因为可能结果小于0因此(ops+x+len)%len,这两个直接合并就好。
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <map>
    #include <string>
    #include <stack>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    #define S(X) scanf("%d",&(X))
    #define SS(X, Y) scanf("%d%d",&(X),&(Y))
    #define SSS(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
    #define SL(X) scanf("%lld",&(X))
    #define SLL(X, Y) scanf("%lld%lld",&(X),&(Y))
    using namespace std;
    typedef double db;
    typedef long long ll;
    const int maxn=2e6+100;
    const double eps=1e-5;
    using namespace std;
    
    int main()
    {
        #ifdef ONLINE_JUDGE
        #else
            freopen(".vscode/in.txt","r",stdin);
        #endif
        char str[maxn];
        scanf("%s",str);
        getchar();
        int len=strlen(str);
        int q;
        S(q);
        char ch[5];
        int x;
        int ops=0;
        while(q--)
        {
            scanf("%s%d",ch,&x);
            //cout<<ch<<" "<<x<<endl;
            if(ch[0]=='A')
                {
                    //cout<<"ops="<<ops<<" "<<(ops+x-1+len)%len<<endl;
                    printf("%c\n",str[(ops+x-1+len)%len]);
                }
            else
            {
                //if(x>0)
                    ops=(ops+x+len)%len;
                //else
                   // ops=(ops-x+len)%len;
                //cout<<"ops="<<ops<<endl;
            }
            
        }
        return 0;
    }
    

    C.Operation Love

    • 这题呢,找到长度为6和长度为9的两个相临边即可,记录这三个点组成的长度为6(端点为sp,op)和9(端点为op,ep)的两个边,然后按照sp,op,ep的顺序求叉乘即可,大于0就说明短边向长边逆时针旋转左手,小于0说明顺时针旋转右手。一开始设的eps为1e-8,然后改了各种方法结果发现是eps的问题,改了1e5就过了,血亏。。
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <map>
    #include <string>
    #include <stack>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    #define S(X) scanf("%d",&(X))
    #define SS(X, Y) scanf("%d%d",&(X),&(Y))
    #define SSS(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
    #define SL(X) scanf("%lld",&(X))
    #define SLL(X, Y) scanf("%lld%lld",&(X),&(Y))
    using namespace std;
    typedef double db;
    typedef long long ll;
    const int maxn=2e5+100;
    const double eps=1e-5;
    using namespace std;
    struct Point{
        long double x,y;
        Point(long double _x=0,long double _y=0){
            x=_x;
            y=_y;
        }
        Point operator-(const Point& p1)const{return Point(x-p1.x,y-p1.y);}
        Point operator+(const Point& p1)const{return Point(x+p1.x,y+p1.y);}
        bool friend operator<(const Point& p1,const Point& p2){
            if(fabs(p1.x-p2.x)>eps)return p1.x<p2.x;return p1.y<p2.y;
        }//map点的时候
        bool friend operator==(const Point& p1,const Point& p2){
            if(fabs(p1.x-p2.x)>eps)return 0;
            if(fabs(p1.y-p2.y)>eps)return 0;
            return 1;
        }
        long double friend operator^(const Point& p1,const Point& p2){return p1.x*p2.y-p2.x*p1.y;}//共线的时候
        Point friend operator*(const Point& p1,const double& k){return Point(p1.x*k,p1.y*k);}
        long double friend operator*(const Point& p1,const Point& p2){return p1.x*p2.x+p1.y*p2.y;}
    };
    long double dis(Point a,Point b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    long double Cross(Point &sp, Point &ep, Point &op)
    {
        return ((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
    }
    long double Cross1(Point A, Point B){
        return (A.x*B.y-A.y*B.x);
    }
    long double Area(Point* p, int n){
        long double s = 0;
        for(int i = 1; i < n-1; ++i)
            s += Cross1(p[i]-p[0], p[i+1]-p[0]);
        return s;
    }
    int main()
    {
        #ifdef ONLINE_JUDGE
        #else
            freopen(".vscode/in.txt","r",stdin);
        #endif
        int n;
        S(n);
        while(n--)
        {
            Point p[100];
            Point a,b,c,d;
            Point sp,op,ep;
            for(int i=0;i<20;i++)
            {
                scanf("%Lf%Lf",&p[i].x,&p[i].y);
                if(i!=0)
                {
                    long double len=dis(p[i],p[i-1]);
                    //cout<<"len="<<len<<endl;
                    if(fabs(len-9.0)<eps)
                    {
                        a=p[i];b=p[i-1];
                    }
                    else if(fabs(len-6.0)<eps)
                    {
                        c=p[i];
                        d=p[i-1];
                    }
                }
            }
            long double len1=dis(p[0],p[19]);
            // cout<<"len1="<<len1<<endl;
            if(fabs(len1-9.0)<eps)
            {
                //cout<<"haha"<<endl;
                a=p[0];
                b=p[19];
            }
            else if(fabs(len1-6.0)<eps)
            {
                //cout<<"haha"<<endl;
                 c=p[0];
                 d=p[19];
            }
            // cout<<"a= ";
            // cout<<a.x<<" "<<a.y<<endl;
            //  cout<<"b= ";
            // cout<<b.x<<" "<<b.y<<endl;
            //  cout<<"c= ";
            // cout<<c.x<<" "<<c.y<<endl;
            //  cout<<"d= ";
            // cout<<d.x<<" "<<d.y<<endl;
            if(a==c)
            {
                op=a;
                sp=d;
                ep=b;
            }
            else if(a==d)
            {
                op=a;
                sp=c;
                ep=b;
            }
            else if(b==c)
            {
                op=b;
                sp=d;
                ep=a;
            }
            else if(b==d)
            {
                op=b;
                sp=c;
                ep=a;
            }
             //cout<<sp.x<<" "<<sp.y<<endl;
             //cout<<op.x<<" "<<op.y<<endl;
            // cout<<ep.x<<" "<<ep.y<<endl;
            // cout<<"Cross=";
            // cout<<Cross(sp,ep,op)<<endl;
            // Point pp[4];
            // pp[0]=sp,pp[1]=op,pp[2]=ep;
            // cout<<"Area="<<Area(pp,3)<<endl;
            if(Cross(sp,ep,op)>0)
                printf("left\n");
            else
                printf("right\n");
             
        }
        return 0;
    }
    

    L. Problem L is the Only Lovely Problem

    • 签到题,设定一个字符串ans="lovely",然后只要比较前6个字符即可,是否为ans[i]或者toupper(ans[i])即可。
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <map>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <stdlib.h>
    #include <time.h>
    #include <iomanip>
    #define S(X) scanf("%d",&(X))
    #define SS(X, Y) scanf("%d%d",&(X),&(Y))
    #define SSS(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
    #define SL(X) scanf("%lld",&(X))
    #define SLL(X, Y) scanf("%lld%lld",&(X),&(Y))
    using namespace std;
    typedef double db;
    typedef long long ll;
    const int mod = 998244353;
    const int maxn=5e5+100;
    const double pi=acos(-1);
    int main()
    {
    	#ifdef ONLINE_JUDGE
        #else
            freopen(".vscode/in.txt","r",stdin);
        #endif
        string s;
        cin>>s;
        int len=s.length();
        string ss="lovely";
        bool flag=false;
        for(int i=0;i<6;i++)
        {
            if((s[i]==ss[i])||(s[i]==toupper(ss[i])))
                continue;
            else
            {
                flag=true;
                break;
            }
        }
        if(flag)
            printf("ugly\n");
        else
        {
            printf("lovely\n");
        }
        
    	return 0;
    }
    
  • 相关阅读:
    显示等待WebDriverWait
    MySQL添加注释
    linux
    linux时区问题
    CentOS禁用笔记本touchpad
    Mysql事务隔离级别
    IDEA集成有道翻译插件/maven帮助插件/mybatis插件
    SVN服务器的搭建和使用
    IntelliJ IDEA工具的安装使用
    IntelliJ IDEA的使用操作链接
  • 原文地址:https://www.cnblogs.com/branna/p/13341409.html
Copyright © 2020-2023  润新知