AtcoderABC224场

A - TiresA - Tires

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

题目大意

题目要求判断给定字符串S的末尾是以"er"还是"ist"结尾,并输出对应的结果。

思路分析

使用substr函数获取字符串S的末尾2个字符或3个字符。
判断获取到的子字符串是否等于"er"或"ist",如果相等则输出对应的结果。

时间复杂度度

O(1)

AC代码

#include 
#include 
using namespace std;

int main() {
    string s;
    cin >> s;
    if (s.substr(s.size() - 2, 2) == "er") {
        cout << "er";
    }
    else if (s.substr(s.size() - 3, 3) == "ist") {
        cout << "ist";
    }
    return 0;
}

B - MongenessB - Mongeness

AtcoderABC224场_第3张图片在这里插入图片描述AtcoderABC224场_第4张图片

题目大意

给定一个H行W列的矩阵,每个格子中包含一个整数。判断是否满足以下条件:对于任意一组不同的行和列,其交换的元素之和小于等于原来的元素之和。

思路分析

为了判断是否满足条件,可以使用四重嵌套循环来遍历所有可能的两对不同的行和两对不同的列的组合。对于每一组组合,比较交换后的元素之和和原来的元素之和。如果存在交换后的元素之和大于原来的元素之和的情况,则不满足条件输出"No",否则输出"Yes"。

  • 此处不可用两重循环
  • 这样会导致一个错误的假设:每个外层循环的i_1值只会对应一个特定的内层循环的i_2值。然而,实际上,内层循环的i_2值和外层循环的i_1值无关,内层循环中的i_2值应该与i_1值无关。
  • 四重循环可以控制不同行不同列,遍历所有可能的两对不同的行和两对不同的列的组合。

时间复杂度度

O(H2 * W2

AC代码

#include 
using namespace std;

int main(void)
{
  int h, w;
  int a[51][51];
  cin >> h >> w;
  for(int i = 1; i <= h; i++){
    for(int j = 1; j <= w; j++){
      cin >> a[i][j];
    }
  }
  for(int i_1 = 1; i_1 <= h; i_1++){
    for(int i_2 = i_1+1; i_2 <= h; i_2++){
      for(int j_1 = 1; j_1 <= w; j_1++){
        for(int j_2 = j_1+1; j_2 <= w; j_2++){
          if(a[i_1][j_1] + a[i_2][j_2] > a[i_2][j_1] + a[i_1][j_2]){
            cout << "No" << endl;
            return 0;
          }
        }
      }
    }
  }
  cout << "Yes" << endl;
  return 0;
}

C - Triangle?C - Triangle?

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

题目大意

在平面坐标系中,有N个点,编号从1到N。第i个点的坐标为(Xi, Yi)。任意两个不同的点位于不同的位置。
找出选择其中三个点的方式数,使得连接这三个点的线段构成一个面积大于0的三角形。

思路分析

对于N个点,我们使用三重嵌套循环来遍历所有可能的三个点的组合。对于每一组组合,通过计算这三个点形成的三角形的面积来判断是否大于0。如果大于0,则计数器res加一。

  • 关于计算三角形的面积,可以使用行列式的方法,即通过以下公式计算:
    |(p[j].first-p[i].first)(p[k].second-p[i].second)-(p[k].first-p[i].first)(p[j].second-p[i].second)|
  • 其中p[i]、p[j]、p[k]分别表示第i、j、k个点的坐标,如果上述行列式结果不等于0,则说明这三个点形成的三角形的面积大于0。

时间复杂度度

O(N3)

AC代码

#include
using namespace std;
using ll=long long;
int main()
{
  int n;
  cin>>n;
  vector<pair<ll,ll>>p(n); 
  for(auto &nx:p){
    cin>>nx.first>>nx.second;
  }
  int res=0; 
  // 遍历所有可能的三个点的组合
  for(int i=0;i<n;i++){
    for(int j=i+1;j<n;j++){
      for(int k=j+1;k<n;k++){
        // 计算三角形的面积,判断是否大于0
        if((p[j].first-p[i].first)*(p[k].second-p[i].second)-(p[k].first-p[i].first)*(p[j].second-p[i].second)!=0){
          res++; 
        }
      }
    }
  }
  cout<<res<<endl; 
}

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