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;
}