牛客:小红的字符移动,小红的数轴移动,小红的圆移动
小红的字符移动
题目描述
登录—专业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;
}
代码思路
-
变量定义:
char s[5];
:定义了一个字符数组s
,长度为 5,可以用来存储五个字符。 -
输入部分:
for(int i = 0; i < 5; i++){ cin>>s[i]; }
:通过循环从标准输入读取五个字符,依次存入字符数组s
中。 -
输出部分
cout<<s[1]<<s[0];
:先输出数组s
中的第二个字符和第一个字符,实现了两个字符位置的交换。for(int i = 2; i < 5; i++){ cout<<s[i]; }
:接着通过循环输出数组s
中从第三个字符到第五个字符。
-
返回值:
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;
}
代码思路
该代码主要解决的问题是模拟小红在数轴上的移动过程,并计算其移动的总距离。通过循环读取每次移动的距离,并根据当前位置与原点的关系来更新位置和累加移动距离。
-
变量定义与输入读取:在
main
函数中,首先定义了n
和s
,分别用于存储操作次数和小红的初始位置。然后通过cin
从标准输入读取这两个值。接着定义了cnt
,用于累加小红移动的总距离,初始化为0
。 -
循环操作
- 使用
for
循环从1
到n
进行迭代,模拟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
。
- 更新位置:根据题目,如果小红不在原点,她要朝着原点的方向移动
- 首先读取一个整数
- 使用
-
输出结果:循环结束后,
cnt
中存储的就是小红移动的总距离,最后通过cout
将其输出。 -
注意点: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
时的最小总代价。总代价是每个圆的面积乘以移动的距离,移动的距离是将不包含原点的圆移动到刚好不包含原点所需的距离。
-
头文件和常量定义:包含了
<iostream>
、<vector>
、<math.h>
和<algorithm>
头文件,分别用于输入输出、动态数组、数学函数和排序算法。定义了常量PI
表示圆周率。 -
自定义函数
get
:get
函数接受两个参数x
和y
,代表圆的圆心坐标。- 函数计算并返回圆心到原点的距离的平方,即
1.0*x*x + 1.0*y*y
。
-
main
函数:- 输入部分:
- 首先通过
cin
读取输入的两个正整数n
和k
,分别代表圆的数量和最终包含原点的圆的最大数量。 - 然后使用一个循环读取
n
个圆的信息,每个圆由三个整数x
、y
和r
表示圆心坐标和半径。
- 首先通过
- 处理部分:对于每个圆,判断圆心到原点的距离的平方是否小于半径的平方,如果是,则说明该圆包含原点。对于不包含原点的圆,计算将其移动到刚好不包含原点的代价。
- 最后计算该圆的移动代价
w = s * (r - d)
,并将其存储在ans
向量中。 - 然后计算圆心到原点的距离
d = sqrt(get(x, y))
。 - 首先计算圆的面积
s = PI * r * r
。
- 最后计算该圆的移动代价
- 输出部分:
- 如果包含原点的圆的数量已经不超过
k
,则输出0
,表示不需要进行任何操作。 - 如果需要进行操作,对存储代价的
ans
向量进行排序,然后累加前ans.size() - k
个元素,表示将这些不包含原点的圆移动到刚好不包含原点的总代价,并按照要求的精度输出。
- 如果包含原点的圆的数量已经不超过
- 输入部分:
- 计算圆心到原点的距离:使用勾股定理的原理,对于平面上的点
(x, y)
,其到原点的距离为sqrt(x * x + y * y)
。 - 计算圆的面积:根据圆的面积公式
S = πr²
,其中r
是圆的半径。 - 计算移动代价:对于不包含原点的圆,需要将其移动到刚好不包含原点的位置,移动的距离是半径减去圆心到原点的距离,即
r - d
,然后乘以圆的面积得到移动的代价。 - 排序和选择最小总代价:通过对所有不包含原点的圆的移动代价进行排序,选择最小的
ans.size() - k
个代价进行累加,得到最小总代价。这是因为要使包含原点的圆数量不超过k
,就需要将多余的不包含原点的圆移动到刚好不包含原点的位置,选择最小的代价进行累加可以保证总代价最小。