欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

2020-8-7 个人赛补题

程序员文章站 2022-06-18 10:18:02
链接: link.这个题一开始想用KMP解决,发现在字符串中间可能会有“fashjhfSussu”这样的形式,所以还是采取暴力解决#include #include #include #include using namespace std;const int N = 1001000;char str[N];int main(){ int flag =...

链接: link.
这个题一开始想用KMP解决,发现在字符串中间可能会有“fashjhfSussu”这样的形式,所以还是采取暴力解决

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>

using namespace std;

const int N = 1001000;
char str[N];

int main()
{
    int flag = 1;//标记
    memset(str,0,sizeof(str));
    gets(str);//输入字符串
    int len = strlen(str);
    if(str[len-1]=='?')//如果是问号直接输出
        cout<<"7"<<endl;
    else
    {
        for(int i = 0; i <= len; i++)//遍历
        {
            if(str[len-6] == 'S' && str[len-5] == 'u' && str[len-4] == 's' && str[len-3] == 's' && str[len-2] == 'u')
            {
                //是否在字符串末尾
                printf("AI SUSSU!\n");
                flag = 0;
                break;
            }
            else if(str[0] == 'S' && str[1] == 'u' && str[2] == 's' && str[3] == 's' && str[4] == 'u' && str[5] == ' ')
            {
                //是否在字符串开头
                printf("AI SUSSU!\n");
                flag = 0;
                break;
            }
            else if(str[i] == ' ' && str[i+1] == 'S' && str[i+2] == 'u' && str[i+3] == 's' && str[i+4] == 's' && str[i+5] == 'u' && str[i+6] == ' ')
            {
                //是否在字符串中间,注意str[i]一定是空格且str[i+6]也是空格
                printf("AI SUSSU!\n");
                flag = 0;
                break;
            }
        }
        if(flag==1)
            printf("O cara é bom!\n");
    }
    return 0;
}

链接: link.
这个题就是给定一块区域,在区域中摆放盘子或取走盘子,让我们判断操作是否可行,我们定义两个二维数组:vis[n][n],rr[n][n],前者作为标记数组判断当前位置是否已经被占用了,后者存放该位置盘子的半径,每当我们放进盘子时就把半径存入,取出盘子时用于我们判断该位置盘子的半径是否满足条件

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

#define N 5050

using namespace std;

struct node
{
    char c;
    int x;
    int y;
    int r;
} an[N];

int vis[1005][1005];//标记数组,判断该位置是否为空
int rr[1005][1005];//存放当前位置放的盘子的半径

int main()
{
    memset(vis,0,sizeof(vis));
    memset(rr,0,sizeof(rr));
    int t,j;
    cin>>t;
    for(int i=1; i<=t; ++i)
    {
        cin>>an[i].c>>an[i].x>>an[i].y>>an[i].r;
        if(an[i].x<0||an[i].y<0||an[i].x>1000||an[i].y>1000)
        {//超出坐标限制直接输出No
            cout<<"No"<<endl;
            continue;
        }
        if(an[i].c=='R')
        {
            if(vis[an[i].x][an[i].y]!=0&&rr[an[i].x][an[i].y]==an[i].r)
            {//判断当前位置是否有盘子,且半径是否符合要求
                cout<<"Ok"<<endl;
                vis[an[i].x][an[i].y]=0;//移除后清空标记
            }
            else
                cout<<"No"<<endl;
        }
        else if(an[i].c=='A')
        {
            if(vis[an[i].x][an[i].y]!=0)//如果位置已经被用了
                cout<<"No"<<endl;
            else
            {
                for(j=1; j<=i-1; ++j)//遍历前几个已经放上的盘子,看是否能放下
                {
                    if(an[j].c=='A'&&vis[an[j].x][an[j].y]!=0&&rr[an[j].x][an[j].y]==an[j].r)
                    {
                        if((an[j].r+an[i].r)*(an[j].r+an[i].r)>(an[j].x-an[i].x)*(an[j].x-an[i].x)+(an[j].y-an[i].y)*(an[j].y-an[i].y))
                        {//出现相交则不符合
                            cout<<"No"<<endl;
                            break;
                        }
                    }
                }
                if(j==i)//如果遍历完均无相交
                {
                    cout<<"Ok"<<endl;
                    vis[an[i].x][an[i].y]=1;
                    rr[an[i].x][an[i].y]=an[i].r;
                }
            }
        }
    }
    return 0;
}

本文地址:https://blog.csdn.net/qq_45728527/article/details/107875710