AtcoderABC225场

A - Distinct StringsA - Distinct Strings

AtcoderABC225场_第1张图片AtcoderABC225场_第2张图片

题目大意

给定一个长度为3的字符串S,由小写英文字母组成。
求通过排列S中的字符可以得到多少不同的字符串。

思路分析

只有三种情况,特判两种最好判断的,字符都相同和字符都不相同,剩下的是第三种。

时间复杂度

O(N)

AC代码

#include
using namespace std;

int main(){
    string S; cin >> S;
    int ans = 3;
    if(S[0]==S[1] && S[1]==S[2]) ans = 1; // 判断字符是否都相同
    else if(S[0]!=S[1] && S[1]!=S[2] && S[2]!=S[0]) ans = 6; // 判断字符是否都不相同
    cout << ans << endl;
}

B - Star or NotB - Star or Not

AtcoderABC225场_第3张图片AtcoderABC225场_第4张图片

题目大意

给定一个具有N个顶点和N-1条边的树。顶点编号为1, 2, …, N。第i条边连接顶点ai和顶点bi。
判断该树是否为星型树。
星型树是指存在一个顶点与所有其他顶点直接相连的树。

思路分析

对于树中的每个顶点,统计其度数(与该顶点相连的边的数目)。如果存在度数为N-1的顶点,则该树为星型树;否则不是星型树。

时间复杂度

O(N)

AC代码

#include
using namespace std;
typedef long long ll;

signed main(){
    ll n;cin>>n;  
    vector<ll>count(n+1);  // 创建长度为N+1的整数数组count,初始化为0,用于统计顶点的度数

    for(ll i=1;i<=n-1;i++){
        ll a,b;cin>>a>>b;  
        count[a]++;  
        count[b]++;  
    }
    for(ll i=1;i<=n;i++){
        if(count[i] == n-1){  
            cout<<"Yes"<<endl;
            return 0;
        }
    }
    cout<<"No"<<endl;  

    return 0;
}

C - Calendar ValidatorC - Calendar Validator

AtcoderABC225场_第5张图片AtcoderABC225场_第6张图片

题目大意

题目要求判断一个N×M矩阵B是否是一个10100×7矩阵A的(未旋转的)矩形部分。

思路分析

分析知B要是A的一部分要满足,相邻列递增相差1,相邻行递增相差7,也要保证是顺数前7个的范围(此代码中保证以第一行为范围束缚)。

时间复杂度

O(N×M)

AC代码

#include
using namespace std;
using ll=long long;
int main()
{
  ll n,m;
  cin>>n>>m;
  vector<vector<int>> B(n,vector<int>(m));
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++) cin >> B[i][j];
    }
   bool ans=true;
  int t=(B[0][0]-1)%7;
  if(t+m>7) ans=false;
  for(int i=0;i<n;i++)
  {for(int j=0;j<m-1;j++){
    if(B[i][j+1]-B[i][j]!=1)
      ans=false;
  }
  }
  for(int j=0;j<m;j++){
    for(int i=0;i<n-1;i++){
      if(B[i+1][j]-B[i][j]!=7)
        ans=false;
    }
  }
  if(ans){
    cout<<"Yes"<<endl;
  }else{
    cout<<"No"<<endl;
  }
}

你可能感兴趣的:(算法)