牛客:小红的字符移动,小红的数轴移动,小红的圆移动

小红的字符移动

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char s[5];
    for(int i=0;i<5;i++){
        cin>>s[i];
    }
    cout<<s[1]<<s[0];
    for(int i=2;i<5;i++){
        cout<<s[i];
    }
    return 0;
}

代码思路

  1. 变量定义:char s[5];:定义了一个字符数组s,长度为 5,可以用来存储五个字符。

  2. 输入部分:for(int i = 0; i < 5; i++){ cin>>s[i]; }:通过循环从标准输入读取五个字符,依次存入字符数组s中。

  3. 输出部分

    • cout<<s[1]<<s[0];:先输出数组s中的第二个字符和第一个字符,实现了两个字符位置的交换。
    • for(int i = 2; i < 5; i++){ cout<<s[i]; }:接着通过循环输出数组s中从第三个字符到第五个字符。
  4. 返回值:return 0;:表示程序正常结束,返回值为 0。

小红的数轴移动

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
using namespace std;
int main() {
    int n, s;
    cin >> n >> s;
    long long cnt = 0;
    for (int i = 1; i <= n; ++i) {
        long long  x;
        cin >> x;
        if (s == 0)
            break;
        cnt += x;
        s += (s > 0? -x : x);
    }
    cout << cnt;
    return 0;
}

代码思路

该代码主要解决的问题是模拟小红在数轴上的移动过程,并计算其移动的总距离。通过循环读取每次移动的距离,并根据当前位置与原点的关系来更新位置和累加移动距离。

  1. 变量定义与输入读取:main函数中,首先定义了ns,分别用于存储操作次数和小红的初始位置。然后通过cin从标准输入读取这两个值。接着定义了cnt,用于累加小红移动的总距离,初始化为0

  2. 循环操作

    • 使用for循环从1n进行迭代,模拟n次操作。
    • 在每次循环中:
      • 首先读取一个整数x,它表示小红本次操作(如果移动)移动的距离。
      • 然后检查小红当前的位置s是否为0。如果s等于0,说明小红已经在原点,根据题目规则,此时原地不动,直接跳出循环,不再进行后续操作。
      • 如果s不为0,则需要更新小红的位置和累加移动距离。
        • 更新位置:根据题目,如果小红不在原点,她要朝着原点的方向移动x距离。如果s大于0(即小红在原点右侧),则s需要减去x(即s += -x);如果s小于0(即小红在原点左侧),则s需要加上x(即s += x)。
        • 累加距离:无论小红在原点左侧还是右侧移动,移动的距离x都要累加到总移动距离cnt中,即cnt += x
  3. 输出结果:循环结束后,cnt中存储的就是小红移动的总距离,最后通过cout将其输出。

  4. 注意点:cnt的数据类型为long long型数据,防止数据溢出

小红的圆移动

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
const double PI=3.1415926535;
double get(int x,int y){
    return 1.0*x*x+1.0*y*y;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,k;
    cin>>n>>k;
    vector<double>ans;
    for(int i=0;i<n;i++){
        int x,y,r;
        cin>>x>>y>>r;
        if(get(x,y)<1.0*r*r){
            double s=PI*r*r;
            double d=sqrt(get(x,y));
            double w=s*(r-d);
            ans.push_back(w);
        }
    }
    if(ans.size()<=k)
        cout<<0;
    else{
        sort(ans.begin(),ans.end());
        double res=0;
        for(int i=0;i<ans.size()-k;i++)
            res+=ans[i];
        printf("%.15lf",res);
    }
    return 0;
}

代码思路

小红对平面上的n个圆进行操作,使得最终包含原点的圆数量不超过k时的最小总代价。总代价是每个圆的面积乘以移动的距离,移动的距离是将不包含原点的圆移动到刚好不包含原点所需的距离。

  1. 头文件和常量定义:包含了<iostream><vector><math.h><algorithm>头文件,分别用于输入输出、动态数组、数学函数和排序算法。定义了常量PI表示圆周率。

  2. 自定义函数get

    • get函数接受两个参数xy,代表圆的圆心坐标。
    • 函数计算并返回圆心到原点的距离的平方,即1.0*x*x + 1.0*y*y
  3. main函数:

    • 输入部分:
      • 首先通过cin读取输入的两个正整数nk,分别代表圆的数量和最终包含原点的圆的最大数量。
      • 然后使用一个循环读取n个圆的信息,每个圆由三个整数xyr表示圆心坐标和半径。
    • 处理部分:对于每个圆,判断圆心到原点的距离的平方是否小于半径的平方,如果是,则说明该圆包含原点。对于不包含原点的圆,计算将其移动到刚好不包含原点的代价。
      • 最后计算该圆的移动代价w = s * (r - d),并将其存储在ans向量中。
      • 然后计算圆心到原点的距离d = sqrt(get(x, y))
      • 首先计算圆的面积s = PI * r * r
    • 输出部分:
      • 如果包含原点的圆的数量已经不超过k,则输出0,表示不需要进行任何操作。
      • 如果需要进行操作,对存储代价的ans向量进行排序,然后累加前ans.size() - k个元素,表示将这些不包含原点的圆移动到刚好不包含原点的总代价,并按照要求的精度输出。
  4. 计算圆心到原点的距离:使用勾股定理的原理,对于平面上的点(x, y),其到原点的距离为sqrt(x * x + y * y)
  5. 计算圆的面积:根据圆的面积公式S = πr²,其中r是圆的半径。
  6. 计算移动代价:对于不包含原点的圆,需要将其移动到刚好不包含原点的位置,移动的距离是半径减去圆心到原点的距离,即r - d,然后乘以圆的面积得到移动的代价。
  7. 排序和选择最小总代价:通过对所有不包含原点的圆的移动代价进行排序,选择最小的ans.size() - k个代价进行累加,得到最小总代价。这是因为要使包含原点的圆数量不超过k,就需要将多余的不包含原点的圆移动到刚好不包含原点的位置,选择最小的代价进行累加可以保证总代价最小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值