Atcoder Beginner Contest 295

文章包含四道编程题目,分别涉及英语单词判断、矩阵模拟爆炸效果、袜子配对及字符串中连续数字的奇偶性统计。通过AC代码展示了解题思路,如使用条件判断检查特定单词、四重循环模拟矩阵爆炸以及利用二进制异或操作计算奇偶性区间。
摘要由CSDN通过智能技术生成

A - Probably English

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
string s[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    bool flag=false;
    for(int i=1;i<=n;i++){
        if(s[i]=="and"||s[i]=="not"||s[i]=="that"||s[i]=="the"||s[i]=="you"){
            flag=true;
            break;
        }
    }
    if(flag) puts("Yes");
    else puts("No");
     return 0;
}

B - Bombs

数据非常的小,直接纯模拟,用四重循环,从头开始遍历,如果遇到炸弹,就遍历所有的格子,看是否能被炸弹炸到

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=50;
char a[N][N];
char b[N][N];
int main()
{
    int h,w;
    cin>>h>>w;
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            b[i][j]=a[i][j];
        }
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            if(a[i][j]>='0'&&a[i][j]<='9'){
                int num=a[i][j]-'0';
                for(int m=1;m<=h;m++){
                    for(int n=1;n<=w;n++){
                        if(abs(m-i)+abs(n-j)<=num){
                            b[m][n]='.';
                        }
                    }
                }
            }
        }
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cout<<b[i][j];
        }
        cout<<endl;
    }
    return 0;
}

C - Socks

这题就是两两颜色一样的进行配对

用map记录每种颜色的次数,然后每种颜色的次数/2全部加起来

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
map<int,int>mp;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        mp[x]++;
    }
    int res=0;
    for(auto v:mp){
        res+=v.second/2;
    }
    cout<<res<<endl;
    return 0;
}

D - Three Days Ago

大致题意是在某个区间中所有数字的的个数都是偶数,问有几个这样的区间

前置知识: 

1<<4表示将1的二进制表示左移4位(每左移一位则在原来的数后面加一个0,相当于乘2),得到16

1<<x:其中x是字符串上的数字字符所对应的数字,比如说某个字符为4,那么1<<4就变成了10000,对应的十进制即为16,100000就代表了数字4的次数是奇数次,比如说下一个数字还是4,state为100000,那么state^=100000,state就等于000000,此时1<<4的那一位变成了0,就代表数字4的次数为偶数

state一开始是0,表示每个数的次数都是偶数次(0就是偶数嘛),然后一步一步进行异或操作表示到某一步的每个数的次数是奇数还是偶数

一开始初始化二进制序列000000000为1,因为当第一次出现有一个序列全是偶数的时候,就需要res加上它前面的二进制序列为0000000的个数,即为1

异或(^)==>相同为0,不同为1(0代表偶上次,1代表奇数次,刚好对应了偶数加偶数为偶数,奇数加奇数为偶数,奇数加偶数为奇数)

具体做法:

对于字符串s,我们一位一位遍历,然后每次得到一个数字,然后它的次数每次都是加1,这样的话,我们就得到了每走一步(表示一步一步的进程)的所有数字(0到9)是奇数次还是偶数次所组成的二进制序列,如果在某一步,它所组成的二进制序列和前面有相同的话,那么就说明该步和前面某步的每个数的要么都是偶数次,要么都是奇数次,那么从开始到现在的区间减去和开始到某点的区间的每个数就都是偶数次,它们之间的区间就满足要求,如果前面有n个同样的二进制序列,那么之间就有n个满足要求的区间

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#define int long long
using namespace std;
map<int,int>mp;
int state;
signed main()
{
    string s;
    cin>>s;
    mp[0]=1;
    int n=s.size();
    int res=0;
    for(int i=0;i<n;i++){
        state^=(1<<(s[i]-'0'));
        res+=mp[state];//加上前面已经出现过的相同的二进制序列的次数
        mp[state]++;//该二进制序列次数加一次
    }
    cout<<res<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值