用户登录
用户注册

分享至

2020-8-7 个人赛补题

  • 作者: 用户64654858
  • 来源: 51数据库
  • 2021-07-08

链接: 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;
}
软件
前端设计
程序设计
Java相关