第 210 場周賽

夕林山寸發表於2020-10-11
100 / 4006xu-ri-dong-sheng-f 181:19:04

lt的題比較簡單,但是他這個函式提交太難除錯了,大部分時間花在這裡

5535. 括號的最大巢狀深度

迴圈搞一搞就行

class Solution {
public:
    int maxDepth(string s) {
        int n =s.length();
        int ans=0,mx=0;
        for(int i=0;i<n;i++){
            if(s[i]=='(')ans++;
            if(s[i]==')')ans--;
            mx=max(mx,ans);
        }
        return mx;
    }
};

5536. 最大網路秩

列舉兩個點,搞一搞就行

class Solution {
public:
    int head[10000+7],cnt=1;
    void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
    struct EDGE{int to,nxt,w;}ee[10000*2+7];
    void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
    int maximalNetworkRank(int n, vector<vector<int>>& roads) {
        for(int i=0;i<roads.size();i++){
                int u=roads[i][0],v=roads[i][1];
                add(u,v,0),add(v,u,0);
            }
        int mx=0;
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++){
                vector<int>tp;
                int ans=0; 
                for(int k=head[i];k;k=ee[k].nxt)
                	ee[k].w=ee[k^1].w=1,tp.push_back(k),ans++;
                //cout<<i<<"  --  "<<j<<"   =  "<<ans<<endl;
                for(int k=head[j];k;k=ee[k].nxt){
                	if(ee[k].w==0)ans++;
                	ee[k].w=ee[k^1].w=1,tp.push_back(k);
				}
                //cout<<ans<<endl;
				mx=max(mx,ans);
                for(auto x:tp)ee[x].w=ee[x^1].w=0;
            }
        return mx;
    }
};

1616. 分割兩個字串得到迴文串

寫完馬拉車後發現。。貪心搞一搞就行。。。

最後一定是 :前一部分 是a前與b後匹配,或b前與a後匹配,中間是a自身或b自身匹配

class Solution {
public:
    bool checkPalindromeFormation(string a, string b) {
    	int na=a.length(),nb=b.length();
		bool f=true;
		for(int i=0;i<na;i++)if(a[i]!=a[na-i-1])f=false;
		if(f)return true;
		f=true;
		for(int i=0;i<nb;i++)if(b[i]!=b[nb-i-1])f=false;
		if(f)return true;
		int op=0;bool fa=true,fb=true;
		for(int i=0;i<na/2;i++){
			int r=na-i-1;
			//cout<<i<<"   "<<a[i]<<"  "<<b[r]<<" -  "<<a[r]<<endl;
			if(a[i]==b[r])continue;
			//i->r
			for(int j=i;j<=r;j++){
				if(a[j]!=a[na-j-1])fa=false;
				if(b[j]!=b[na-j-1])fb=false;
			}
			break;
		}
		if(fa||fb)return true;
		fa=fb=true;
		for(int i=0;i<na/2;i++){
			int r=na-i-1;
			//cout<<i<<"   "<<a[i]<<"  "<<b[r]<<" -  "<<a[r]<<endl;
			if(b[i]==a[r])continue;
			//i->r
			for(int j=i;j<=r;j++){
				if(a[j]!=a[na-j-1])fa=false;
				if(b[j]!=b[na-j-1])fb=false;
			}
			break;
		}
		if(fa||fb)return true;
		return false;
    }
};

5538. 統計子樹中城市之間最大距離

列舉子集,然後求直徑就行。。


class Solution {
public:
    

    
int head[16],cnt=1;
struct EDGE{int to,nxt,w;}ee[16*2+7];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}

int ans[16],vs[16];
int nm,mx,p;
void dfs(int x,int fa,int dis){
	nm++;
//	cout<<x<<" -  "<<fa<<endl;
	if(dis>mx)mx=dis,p=x;
	for(int i=head[x];i;i=ee[i].nxt){
		int y=ee[i].to;
		if(!vs[y]||y==fa)continue;//y沒被選中
		dfs(y,x,dis+1); 
	}
}
vector<int> countSubgraphsForEachDiameter(int n, vector<vector<int>>& edges) {
	for(int i=0;i<n-1;i++){
		int u =edges[i][0],v=edges[i][1];
	//	cout<<u<<" - "<<v<<endl;
		add(u,v,1);add(v,u,1);
	}
	for(int sta=1;sta<(1<<n);sta++){
		memset(vs,0,sizeof(vs));
		int rt=0,tm=0;
	//	cout<<sta<<"- -  ok"<<endl;
		for(int i=1;i<=n;i++)
			if(sta>>(i-1)&1)vs[i]=1,rt=i,tm++;
		mx=nm=p=0;
		dfs(rt,0,0);
		int q=p;
		if(nm!=tm)continue;//不是一個子集 
		mx=nm=0;
		dfs(p,0,0);
	//	cout<<mx<<endl;
		ans[mx]++;
	}
	vector<int>pr;
	for(int i=1;i<n;i++)pr.push_back(ans[i]);
	return pr; 
}
};

 

相關文章