比赛时总共做出来四题,遂补题
AB.相对较水,不提了。
C.搜索: 本题开始一看不知道怎么开始搜索,但是仔细想会发现只需要从起点开始搜索可以到达的所有草就行了,因为在你能走到的任何地方放炸弹最后的效果都是一样的,都会四处扩展,所以一次搜索就可以解决。
代码:我这里写了dfs和bfs两个版本,全都ac了
注意在bfs时已经出队处理过的点要做好标记并判断,避免重复入队,造成内存超了,见注释
#include<bits/stdc++.h>
using namespace std;
int mp[1001][1001];
int n,m;
int sx,sy;
int ans;
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
struct point{
int x,y;
};
void bfs(){
queue<point>q;
point start;
start.x=sx;
start.y=sy;
q.push(start);
while(!q.empty()){
point pn=q.front();
q.pop();
if(mp[pn.x][pn.y]==2)continue;//如果标记过了就不用继续入队
if(mp[pn.x][pn.y]==1){
ans++;
}
mp[pn.x][pn.y]=2;
// cout<<pn.x<<" "<<pn.y<<"\n";
for(int i=0;i<=3;i++){
int xx,yy;
point pt;
xx=pn.x+dx[i];
yy=pn.y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m){
if(mp[xx][yy]!=-1&&mp[xx][yy]!=2){
pt.x=xx;pt.y=yy;
q.push(pt);//最好是入队时标记
//mp[xx][yy]=2;
}
}
}
}
}
void dfs(int x,int y){
if(mp[x][y]==1){ans++;}
mp[x][y]=2;
for(int i=0;i<=3;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m){
if(mp[xx][yy]!=-1&&mp[xx][yy]!=2){
dfs(xx,yy);
}
}
}
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
scanf(" %c",&c);
if(c=='.'){
mp[i][j]=0;continue;
}
if(c=='#'){
mp[i][j]=-1;continue;
}
if(c=='!'){
mp[i][j]=1;continue;
}
if(c=='@'){
mp[i][j]=0;
sx=i;
sy=j;
continue;
}
}
}
bfs();
//dfs(sx,sy);
cout<<ans<<"\n";
return 0;
}
D。这个题我们可以把这一串01序列以1为分界点进行分开。
对于一个1,包含它的孤独序列数量如下:
1,它本身,1个
2,由它左边的0和它本身一起构成的,数量就等于它左边的0的数目
3.由它右边的0和它本身一起构成的,等于它右面0的数目
4.它左右的0和它本身一起构成的,由乘法原理就等于2,3乘积就行
所以就是扫描整个序列,碰到1就执行左右找0的操作,然后按上述计算,加一起就行
别忘了开long long!
#include<bits/stdc++.h>
using namespace std;
int arr[1000003];
int n;
long long ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
for(int i=1;i<=n;i++){
if(arr[i]==0)continue;
if(arr[i]==1){
long long con=0,con2=0;
while(1){
con++;
if(i-con<=0){
con--;
break;
}
if(arr[i-con]==1){
con--;
break;
}
}
while(1){
con2++;
if(i+con2>n){
con2--;
break;
}
if(arr[i+con2]==1){
con2--;
break;
}
}
ans=ans+con+con2+(con*con2)+1;
}
}
cout<<ans<<"\n";
return 0;
}
E。博弈,看了讲解视频才明白一点。总体就是,记忆化搜索打表找规律,找到规律之后就很简单。。。具体可以看b站视频,打表的程序就不放了,b站上有
#include<bits/stdc++.h>
using namespace std;
int le(int x){
int r=0;
while(x){
x=x/2;
r++;
}
return r;
}
int main(){
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
if(le(n+1)!=le(m+1)){
cout<<"Alice\n";
}else{
cout<<"Bob\n";
}
}
return 0;
}
总结:基础还是要加强,多加练习思维和熟练度!我太菜了!