寒假每日一题2022week1 未完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题2022week1 未完结相关的知识,希望对你有一定的参考价值。
目录
2058. 笨拙的手指【枚举】
#include<bits/stdc++.h>
using namespace std;
string a,b;
typedef long long int LL;
bool check(int sum)
string temp;
if(sum==0) temp="0";
while(sum) temp=to_string(sum%3)+temp,sum/=3;
int cnt=0;
for(int i=0;i<b.size();i++) if(temp[i]!=b[i]) cnt++;
if(temp.size()==b.size()&&cnt==1) return true;
return false;
int main(void)
cin>>a>>b;
for(int i=0;i<a.size();i++)//枚举哪一位是错的
LL sum=0;
for(int j=0;j<a.size();j++)
if(i==j) sum=sum*2+!(a[j]-'0');
else sum=sum*2+a[j]-'0';
if(check(sum))
cout<<sum<<endl;
return 0;
return 0;
2041. 干草堆【差分】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int c[N],n,m;
vector<int>ve;
void add(int l,int r,int w)
c[l]+=w;
c[r+1]-=w;
int main(void)
cin>>n>>m;
while(m--)
int a,b; cin>>a>>b;
add(a,b,1);
for(int i=1;i<=n;i++)
c[i]+=c[i-1];
ve.push_back(c[i]);
sort(ve.begin(),ve.end());
cout<<ve[n/2];
return 0;
2060. 奶牛选美【dfs + 思维】
讲不同连通块的点,存放到两个集合中。
然后枚举俩集合的点,求俩集合任意俩点的距离。
俩点的最短距离,必定为曼哈顿距离,但是俩点的曼哈顿距离可能又一些障碍点。
但是问题就有准换到这俩点的距离了。故直接枚举点求所有的曼哈顿距离取一个min即可。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=155;
string s[N];
int n,m,cnt;
int dx[4]=-1,0,0,1;
int dy[4]=0,-1,1,0;
vector<PII> ve[15];
void dfs(int x,int y,int k)
ve[k].push_back(x,y);
s[x][y]='.';
for(int i=0;i<4;i++)
int tempx=x+dx[i];
int tempy=y+dy[i];
if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;
if(s[tempx][tempy]!='X') continue;
dfs(tempx,tempy,k);
int solve(PII a,PII b)
return abs(a.first-b.first)+abs(a.second-b.second)-1;
int main(void)
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s[i][j]=='X') dfs(i,j,cnt++);
int ans=1e9;
for(int i=0;i<ve[0].size();i++)
for(int j=0;j<ve[1].size();j++)
ans=min(ans,solve(ve[0][i],ve[1][j]));
cout<<ans;
return 0;
2019. 拖拉机【双端队列】
将其转化成一个图论的问题求最短路,因为只有边权0和1,故可以直接用双向广搜,0加入到对头,1加入到队尾。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int g[N][N],dist[N][N],st[N][N],n,stx,sty;
int dx[4]=-1,0,0,1;
int dy[4]=0,-1,1,0;
int bfs(int x,int y)
memset(dist,0x3f,sizeof dist);
dist[x][y]=0;
deque<pair<int,int>>q; q.push_back(x,y);
while(q.size())
auto temp=q.front(); q.pop_front();
x=temp.first,y=temp.second;
if(!x&&!y) return dist[x][y];
if(st[x][y]) continue;
st[x][y]=1;
for(int i=0;i<4;i++)
int tempx=x+dx[i];
int tempy=y+dy[i];
if(tempx<0||tempx>=N||tempy<0||tempy>=N) continue;
int w=0;
if(g[tempx][tempy]) w=1;//障碍物
if(dist[tempx][tempy]>dist[x][y]+w)
dist[tempx][tempy]=dist[x][y]+w;
if(w) q.push_back(tempx,tempy);
else q.push_front(tempx,tempy);
return -1;
int main(void)
cin>>n>>stx>>sty;
while(n--)
int a,b; cin>>a>>b;
g[a][b]=1;
cout<<bfs(stx,sty);
return 0;
以上是关于寒假每日一题2022week1 未完结的主要内容,如果未能解决你的问题,请参考以下文章