2020牛客第三场A,B,C

A Clam and Fish
思路:
1.考虑在每个阶段所应该采取的操作。
2.在类型2与3时,直接抓鱼永远是最佳选择。但是在类型0时,只能通过鱼饵抓鱼;
3.类型1时,可以换鱼饵或者用鱼饵抓鱼。 所以,我们先忽视前导0,在3或4时答案加1。
4.后面遇到一个0,就尽可能使用鱼饵;遇到1,就先默认制作鱼饵,将现在拥有的鱼饵数量加1。
5.最后如果有剩余鱼饵,则可以用2次类型1的多余阶段来再抓一条鱼(一次换鱼饵,一次抓鱼)。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int t, num = 0, b = 0;
        char a[2000001];
        cin >> t;
        for (int i = 0; i < t; i++)
        {
            cin >> a[i];
            if (b > 0 && a[i] == '0')
            {
                num++;
                b--;
            }
            if (a[i] == '2' || a[i] == '3')
                num++;
            if (a[i] == '1')
                b++;
        }
        num += b / 2;
        cout << num << endl;
    }
    return 0;
}

B Classical String Problem
思路:
把字符串当成一个环,这样无论是左移还是右移,某字符的位置是不变的

#include <bits/stdc++.h>
using namespace std;
char s[2000010];
int main()
{
    scanf("%s", s);
    int n, t = 0;
    int length = strlen(s);
    scanf("%d", &n);
    while (n--)
    {
        char b;
        int x;
        scanf(" %c%d", &b, &x);
        if (b == 'A')
        {
            x--;
            printf("%c\n", s[(t + x) % length]);
        }
        else
        {
            if (x > 0)
            {
                t = x + t;
            }
            else
            {
                t = (t + length - abs(x)) % length;
            }
        }
    }
}

C Operation Love
思路:
暴力判边,记录右手掌的每一条边,求出给出点的每一条边,然后暴力比较即可,注意有个坑点就是如果左手掌逆时针输入的话边的长度就和顺时针的右手掌一样,所以也要计算一遍叉积,详见代码。

#include <bits/stdc++.h>
using namespace std;
const double eps=1e-5;
struct point{
    double x,y;
}p1[20],p2[20],p3[20];
double e1[20],e2[20],e3[20];
double Distance(point p1,point p2){
return (sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
double cross(point a,point b,point c){
    return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
bool judge(){
    for(int i=0;i<20;i++){//与右手掌的顺时针边比较
        int flag=0;
        for(int j=0;j<20;j++){
            if(fabs(e2[(j+i)%20]-e1[j])<eps) flag++;
        }
        if(flag==20){
            if(cross(p1[19],p1[1],p1[0])*cross(p2[i-1<0?19:i-1],p2[(i+1)%20],p2[i])>0) return 1;
        }
    }
    for(int i=0;i<20;i++){与右手掌的逆时针边比较
        int flag=0;
        for(int j=0;j<20;j++){
            if(fabs(e3[(j+i)%20]-e1[j])<eps) flag++;
        }
        if(flag==20){
             if(cross(p1[19],p1[1],p1[0])*cross(p3[i-1<0?19:i-1],p3[(i+1)%20],p3[i])>0) return 1;
        }
    }
    return 0;
}

int main(){
    p2[0].x=1.000000,p2[0].y=0.000000;
    p2[1].x=10.000000,p2[1].y=0.000000;
    p2[2].x=10.000000,p2[2].y=8.000000;
    p2[3].x=9.000000,p2[3].y=8.000000;
    p2[4].x=9.000000,p2[4].y=5.000000;
    p2[5].x=8.000000,p2[5].y=5.000000;
    p2[6].x=8.000000,p2[6].y=10.000000;
    p2[7].x=7.000000,p2[7].y=10.000000;
    p2[8].x=7.000000,p2[8].y=5.000000;
    p2[9].x=6.000000,p2[9].y=5.000000;
    p2[10].x=6.000000,p2[10].y=10.000000;
    p2[11].x=5.000000,p2[11].y=10.000000;
    p2[12].x=5.000000,p2[12].y=5.000000;
    p2[13].x=4.000000,p2[13].y=5.000000;
    p2[14].x=4.000000,p2[14].y=10.000000;
    p2[15].x=3.000000,p2[15].y=10.000000;
    p2[16].x=3.000000,p2[16].y=3.000000;
    p2[17].x=2.000000,p2[17].y=3.000000;
    p2[18].x=2.000000,p2[18].y=6.000000;
    p2[19].x=1.000000,p2[19].y=6.000000;
    for(int i=0;i<20;i++){
        e2[i]=Distance(p2[i],p2[(i+1)%20]);
        if(i==0) p3[i]=p2[i];
        else p3[i]=p2[20-i];
    }
    for (int i=0;i<20;i++) e3[i]=Distance(p3[i],p3[(i+1)%20]);//记录右手掌的逆时针边
    int t;
    scanf("%d",&t);
    while(t--){
        for(int i=0;i<20;i++) scanf("%lf%lf",&p1[i].x,&p1[i].y);
        for(int i=0;i<20;i++) e1[i]=Distance(p1[i],p1[(i+1)%20]);
        if(judge()) printf("right\n"); 
        else printf("left\n");
     }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值