AtcoderABC259场

A - Growth RecordA - Growth Record

AtcoderABC259场_第1张图片
AtcoderABC259场_第2张图片AtcoderABC259场_第3张图片

题目大意

题目要求根据给定的条件计算Takahashi在他的第M个生日时的身高。已知Takahashi的身高在他的每个生日之间以固定的增量D增加,但在某个生日后不再增加。需要根据这些条件计算出Takahashi在第M个生日时的身高。

思路分析

根据题目描述,我们可以先计算出Takahashi在第X个生日时的身高,然后根据给定的条件和输入数据计算出Takahashi在第M个生日时的身高。

时间复杂度

O(1)

代码

#include
using namespace std;

int main() {
  int n, m, x, t, d;
  cin >> n >> m >> x >> t >> d;
  
  if (m < x) {
    t=t-(x-m)*d;
  } 
  
  cout << t << endl;
  
  return 0;
}

B - Counterclockwise RotationB - Counterclockwise Rotation

AtcoderABC259场_第4张图片AtcoderABC259场_第5张图片

题目大意

给定一个点的坐标(a,b)和一个角度增量d,求在原点为中心旋转该点d度后的新坐标(x,y)。

思路分析

1.首先,我们需要计算点(a,b)与原点之间的距离r,可以使用勾股定理计算:r = sqrt(a * a + b * b)。
2.然后,我们需要计算点(a,b)与原点之间的连线的方位角theta,可以使用反正切函数atan2(b, a)计算:theta = atan2(b, a)。
3.接下来,我们将角度增量d转换为弧度制,并将其加到theta上:theta += d * acos(-1.0) / 180.0。
4.最后,我们使用三角函数cos和sin来计算新的坐标(x,y):x = cos(theta) * r,y = sin(theta) * r。

知识点

  • 三角函数
    设r和θ分别为第一步中找到的距离和方位角,θ′为增加了d的方位角θ。在这里,我们的目的是找到距离原点为r且方位角为θ′的点的坐标。
    当r=1时,给定角度θ的x和y坐标等同于三角函数cosθ和sinθ的定义。在像C++这样的许多编程语言中,可以如下获得该值:
x = cos(theta);
y = sin(theta);

当r不一定为1时,将x和y坐标乘以r。

  • 反三角函数
    在第一步中,您需要找到给定点(a,b)与原点的距离r和方位角θ。
    可以找到r为r = sqrt(a
    a + b*b)。
    可以使用三角函数的反函数找到θ。在这里,简单地使用sinθ、cosθ、tanθ的反函数来找到θ需要进行案例划分,这很麻烦,但是像C++这样的许多编程语言具有一个函数atan2(y, x),使我们能够如下找到θ:
theta = atan2(b, a);

因此,可以找到r和θ。

  • 角度,度数问题
    角度以度数给出,而许多编程语言(如C++)处理(由三角函数接受的参数和返回的值)的角度单位是弧度。因此,您需要在处理之前进行转换,即 d’ = d * pi / 180。

时间复杂度

O(1)

代码

#include   // 包含所有常用的标准库文件

using namespace std;  // 使用std命名空间

int main() {
    
    double a, b, d;  // 声明变量a、b和d,类型为double(双精度浮点数)
    cin >> a >> b >> d;  // 输入a、b和d的值
    
    double r = hypot(a, b);  // 计算a和b的平方和的平方根,得到距离r
    double theta = atan2(b, a);  // 计算a和b的反正切值,得到弧度角度theta
    
    theta += d * acos(-1.0) / 180.0;  // 将角度d转换为弧度制,然后将其加到theta上
    
    double x = cos(theta) * r;  // 计算cos(theta)乘以r,得到x坐标
    double y = sin(theta) * r;  // 计算sin(theta)乘以r,得到y坐标
    
    cout << fixed << setprecision(10) << x << ' ' << y << endl;  // 输出结果x和y,保留10位小数
    
    return 0;  // 返回程序执行成功的标志
}

C - XX to XXXC - XX to XXX

AtcoderABC259场_第6张图片AtcoderABC259场_第7张图片AtcoderABC259场_第8张图片

题目大意

给定两个字符串s和t,判断它们是否具有相同的运行长度编码(Run-Length Encoding,RLE)结果。RLE是一种字符串压缩算法,它将连续重复出现的字符表示为字符和计数对的序列。

思路分析

  • 定义一个函数rle,用于将给定字符串进行运行长度编码,即将连续重复出现的字符转换为字符和计数对,并存储在传入的向量中。
  • 在主函数中,输入并编码字符串s和t。
  • 比较编码后的结果svec和tvec的大小,如果不相等,说明两个字符串的编码结果不同,直接输出"No"。
  • 初始化一个布尔变量ans为true,遍历svec和tvec的每对字符和计数对,逐个比较它们的第一个值(字符)和第二个值(计数),如果有不相等的情况,则将ans设置为false。
  • 判断ans的值,如果为true,输出"Yes",表示两个字符串具有相同的编码结果;如果为false,输出"No",表示两个字符串的编码结果不同。

时间复杂度

O(m+n)

代码

#include  // 包含输入输出流的库

#include  // 包含向量容器的库

#include  // 包含对 pair 的支持的库

using namespace std; // 使用标准命名空间

void rle(string s, vector> &vec)
{
  int cnt = 1; // 初始化计数变量为1
  for(int i = 1; i < (int)s.size(); i++){ // 从索引1开始遍历字符串s,直到倒数第二个字符
    if(s[i] != s[i-1]){ // 如果当前字符不等于前一个字符
      vec.push_back({s[i-1], cnt}); // 将前一个字符及其计数加入向量
      cnt = 0; // 重置计数变量为0
    }
    cnt++; // 增加计数
  }
  vec.push_back({s.back(), cnt}); // 将最后一个字符及其计数加入向量
}

int main(void)
{
  string s, t;  
  cin >> s >> t; // 输入两个字符串
  
  vector> svec, tvec; // 定义存储字符和计数对的向量
  rle(s, svec), rle(t, tvec); // 对两个字符串进行运行长度编码,并存储结果到相应的向量中

  if(svec.size() != tvec.size()){ // 如果两个向量的大小不相等
    cout << "No" << endl; // 输出"No"表示结果不相同
    return 0; // 程序结束
  }

  bool ans = true; // 初始化布尔变量为true,用于判断两个字符串是否具有相同的编码结果
  for(int i = 0; i < svec.size(); i++){ // 遍历两个向量中的每对字符和计数对
    if(svec[i].first != tvec[i].first) ans = false; // 如果字符不相等,将布尔变量置为false
    if(!(svec[i].second == tvec[i].second || svec[i].second < tvec[i].second && svec[i].second >= 2)) ans = false; // 如果计数不满足条件,将布尔变量置为false
  }
  if(ans) cout << "Yes" << endl; // 如果布尔变量为true,输出"Yes"表示两个字符串具有相同的编码结果
  else cout << "No" << endl; // 否则输出"No"表示结果不相同

  return 0; // 程序结束
}

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