AtcoderABC234场

A - Weird FunctionA - Weird Function

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

题目大意

要求计算 f(f(f(t)+t)+f(f(t))) ,其中 t 是一个给定的整数。

  • 函数 f(x) 定义为 f(x) = x^2 + 2x + 3。

思路分析

定义实现函数 f(int t),并嵌套调用。

时间复杂度

O(1)

AC代码

#include
using namespace std;

int f(int t) {
    int res = t * t + 2 * t + 3;
    return res;
}
int main() {
    int t;
    cin >> t; =
    int ans = f(f(f(t) + t) + f(f(t)));
    cout << ans << endl;
    return 0;
}

B - Longest SegmentB - Longest Segment

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

题目大意

题目要求在二维平面上找到N个点中连接两个点的最大长度。

思路分析

因为数据范围较小所以可以暴力枚举。注意要满足题目要求误差。在C++中,输出小数时,小数部分的数字位数可能不够满足误差容忍度的要求。所以需要使用 std::fixed 和 std::setprecision(10) 来确保输出的小数位数达到10位,以满足题目对精度的要求。

时间复杂度

O(N2)

AC代码

#include
using namespace std;

int main(){
    int N; 
    cin >> N;
    
    vector<int> x(N), y(N);
    for(int i=0; i<N; i++) {
        cin >> x[i] >> y[i];
    }
    
    double ans = 0;
    for(int i=0; i<N; i++){
        for(int j=i+1; j<N; j++){
            int X = x[i]-x[j], Y = y[i]-y[j];
            ans = max(ans, sqrt(X*X+Y*Y));
        }
    }
    
    cout << fixed << setprecision(10) << ans << endl;
    
    return 0;
}

C - Happy New Year! C - Happy New Year!

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

题目大意

在由0和2组成的十进制数中,找到第K个最小的整数。

思路分析

由0和2组成的正整数在十进制下只包含0和2两个数字。可以将这些整数转换为二进制表示。
实际上,满足条件的第K个最小整数就是K的二进制表示,其中将1替换为2。

时间复杂度

O(log(K))

AC代码

#include

using namespace std;

string convert(long long x){
  string res;
  while(x>0){
    res.push_back('0'+(x%2)); // 将每一位数字转换为0或1并添加到结果字符串中
    x/=2;
  }
  reverse(res.begin(),res.end()); // 反转字符串,得到正确的二进制表示
  return res;
}

void output(string s){
  for(auto &nx : s){
    if(nx=='1'){cout << '2';} // 将1替换为2
    else{cout << '0';} // 保持0不变
  }
  cout << '\n';
}

int main(){
  long long k;
  cin >> k;
  output(convert(k)); // 调用函数进行转换和输出
  return 0;
}

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