Atcoder Beginner Contest 296

A - Alternately

AC代码:

#include
#include
#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    bool flag=true;
    for(int i=0;i

B - Chessboard

AC代码:

#include
#include
#include
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<

C - Gap Existence

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

AC代码:

#include
#include
#include
#include
#define int long long 
using namespace std;
const int N=2e5+10;
int a[N];
signed main()
{
    int n,x;
    cin>>n>>x;
    sets;
    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
#include
#include
#include
#define int long long
using namespace std;
signed main()
{
    int n,m;
    cin>>n>>m;
    if(nx) break;
    }
    cout<

你可能感兴趣的:(Atcoder,Beginner,Contest,c++,算法,set,思维)