Atcoder Beginner Contest 296

A - Alternately

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    bool flag=true;
    for(int i=0;i<n-1;i++){
        if(s[i]=='M'&&s[i+1]=='M'||s[i]=='F'&&s[i+1]=='F'){
            flag=false;
            break;
        }
    }
    if(flag) puts("Yes");
    else puts("No");
     return 0;
}

B - Chessboard

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10;
char s[N][N];
char dx[9]={'0','a','b','c','d','e','f','g','h'};
int main()
{
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            cin>>s[i][j];
        }
    }
    int ix=1,iy=1;
    bool flag=true;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(s[i][j]=='*'){
                ix=i;
                iy=j;
                flag=false;
                break;
            }
        }
        if(!flag) break;
    }
    cout<<dx[iy]<<8-ix+1<<endl;
    return 0;
}

C - Gap Existence

如果纯按照题意模拟的话,会超时,其实只要标记好有哪些数,然后遍历所有数,如果加上x后的数是有的,那么就Yes,否则No

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#define int long long 
using namespace std;
const int N=2e5+10;
int a[N];
signed main()
{
    int n,x;
    cin>>n>>x;
    set<int>s;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s.insert(a[i]);
    }
    bool st=false;
    for(int i=1;i<=n;i++){
        if(s.count(a[i]+x)){
            st=true;
            break;
        }
    }
    if(st) puts("Yes");
    else puts("No");
    return 0;
}

D - M<=ab

题意是给定两个正整数N和M,然后在[1,N]之间选取两个数a,b(a可等于b),x等于a和b的乘积,求x的最小值(其中x大于等于M),如果不存在x,则输出-1

先单独判断特殊情况,如果N*N小于M,那么输出-1(因为N*N可能会超long long,所以改为N小于sqrt(M))

不妨设a小于等于b,然后从1到n遍历作为a的值,而b的值则取M/a向上取整

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
signed main()
{
    int n,m;
    cin>>n>>m;
    if(n<sqrt(m)){
        cout<<-1<<endl;
        return 0;
    }
    int res=1e12+10;
    for(int i=1;i<=n;i++){
        int x;
        if(m%i==0) x=m/i;
        else x=m/i+1;
        if(x<=n) res=min(res,i*x);
        if(i>x) break;
    }
    cout<<res<<endl;
     return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值