CodeForces #124 DIV2

A题:博弈问题,一个矩形放入一个半径为r的圆中,不能放的人就输

可以发现,当在矩形中心放入圆时,就把矩形分成了对称的区域,当对手放进某个区域时,先手可以放在与它对称的区域内

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<string>
using namespace std;
const int M=1005;
int main()
{
    int a,b,r;
    scanf("%d%d%d",&a,&b,&r);
    if(2*r>a || 2*r >b)
    printf("Second\n");
    else
    printf("First\n");
    return 0;
}

B题:取极限问题,分情况讨论就可以

代码:

#include<cstdio>//B
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<string>
using namespace std;
int a[105],b[105];
int gcd(int a,int b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=0; i<=m; i++)
            scanf("%d",&b[i]);

        if(n==m)
        {
            if(a[0]*b[0]<0)
                printf("-");
            int aa=gcd(abs(a[0]),abs(b[0]));
            printf("%d/%d",abs(a[0])/aa,abs(b[0])/aa);
        }
        else if(n>m)
        {
            if(a[0]*b[0]<0)
                printf("-");
            printf("Infinity\n");
        }
        else
            printf("0/1");
    }
    return 0;
}

C题:选出选出字典序最大的子序列,用一个桟单调维护

代码:

#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
#include<string>
using namespace std;
const int M=100005;
stack<int>s1;
stack<int>s2;
char a[M];
int main()
{
    while(scanf("%s",a)!=EOF)
    {
        while(!s1.empty())
        s1.pop();
        while(!s2.empty())
        s2.pop();
        int l=strlen(a);
        for(int i=0;i<l;i++)
        {
            if(s1.empty())
            s1.push(a[i]);
            else
            {
                if(a[i]<=s1.top())
                s1.push(a[i]);
                else
                {
                    while(!s1.empty() && a[i]>s1.top())
                    s1.pop();
                    s1.push(a[i]);
                }
            }
        }
       while(!s1.empty())
       {
           s2.push(s1.top());
           s1.pop();
       }
       while(!s2.empty())
       {
           printf("%c",s2.top());
           s2.pop();
       }
       printf("\n");
    }
    return 0;
}

D题:一个无限大的地图,问是否能够无限走下去

对于每一个位置,如果可以从多个位置到达,则说明进入了循环,便将是可以无限移动的。

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
const int M=100005;
char a[1505][1505];
int vis[1505][1505][2];
int F[1505][1505];
int dis[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct node
{
    int x,y;
};
int n,m;
bool bfs(int si,int sj)
{
    queue<node>q;
    node cur,next;
    cur.x=si;
    cur.y=sj;
    q.push(cur);
    memset(F,0,sizeof(F));
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            next.x=cur.x+dis[i][0];
            next.y=cur.y+dis[i][1];
            int x=((next.x%n)+n)%n;
            int y=((next.y%m)+m)%m;
            if(a[x][y]=='#')continue;
            if(F[x][y])
            {
                if(next.x!=vis[x][y][0] || next.y !=vis[x][y][1])
                return true;
            }
            else
            {
                F[x][y]=1;
                vis[x][y][0]=next.x;
                vis[x][y][1]=next.y;
                q.push(next);
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d%d",&n,&m);
    getchar();
    for(int i=0;i<n;i++)
    scanf("%s",a[i]);
    int si,sj;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    {
        if(a[i][j]=='S')
        {
            si=i;
            sj=j;
            break;
        }
    }
    bool ff=bfs(si,sj);
    if(ff)
    printf("YES\n");
    else
    printf("NO\n");
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值