寒假每日一题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 未完结的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题2022week2 未完结

2021春季每日一题 week1 未完结

2021夏季每日一题 week1 未完结

2021暑假每日一题 week1 完结

寒假每日一题(入门组)week2 完结

春季每日一题2022 Week 1 未完结