AtcoderABC234场

文章提供了三道编程题目,分别涉及函数计算、二维平面上两点间最大距离的寻找以及由0和2组成的十进制数问题。每道题目都给出了思路分析、时间复杂度和AC代码。解决方案包括嵌套函数调用、暴力枚举和二进制转换技巧。
摘要由CSDN通过智能技术生成

A - Weird FunctionA - Weird Function

在这里插入图片描述在这里插入图片描述

题目大意

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

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

思路分析

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

时间复杂度

O(1)

AC代码

#include<bits/stdc++.h>
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

在这里插入图片描述在这里插入图片描述

题目大意

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

思路分析

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

时间复杂度

O(N2)

AC代码

#include<bits/stdc++.h>
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!

在这里插入图片描述在这里插入图片描述

题目大意

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

思路分析

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

时间复杂度

O(log(K))

AC代码

#include<bits/stdc++.h>

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值