第四周第一篇
本周学习了角度的算法,四舍五入函数,快排函数,桶排方法。
第一题:移动距离
这道题是去年蓝桥杯的第一题。
从原点(0.0)移动到(233,666),求最短的移动距离。
移动方案:一,沿着X轴正方向移动。
二,沿着一个以原点(0,0)为圆心,以他的当前位置到原点的距离为半径的圆的圆周移动。
#include <bits/stdc++.h> using namespace std; int main(){ int x=233,y=666; double r=sqrt(x*x+y*y); double jiaodu=acos(x/y); double sum=r+r*jiaodu; int ans=round(sum); cout<<ans<<endl; return 0; }解题思路:只有先沿x轴一直直走,到一定程度后沿着以原点为圆心的圆的圆周移动,才会有最近 的距离。
解题所需的函数应用:1,角度的算法,2,弧度的算法,3,四舍五入的函数。
1,角度的算法:jiaodu=acos(x/r); jiaodu=asin(y/x); jaodu=atan2(y/x);
2,弧度的算法:l(弧长)=r(半径)*jiaodu(角度)
3,四舍五入函数:round(要四舍五入的数)
第二题:欢乐的跳(洛谷)
一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括[1,n-1]之间的所有整数,则称为欢乐的跳数组。
例如{1,4,2,3}符合,因为差的绝对值为3,2,1;
快排函数
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int mark=1; int a[n],b[n]; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ b[i]=abs(a[i]-a[i+1]; } sort(b+1,b+n); for(int i=1;i<=n;i++){ if(b[i]!=i){ mark=0; break;} } if(mark) cout<<"Jolly"<<endl; else cout<<"Not Jolly"<<endl; return 0;}解题思路:假设如果数组属于欢乐的跳mark=1,否则mark=0;求出b[i]后对b[i]中的元素进行排序,对应i,如果每个i对应的都有b[i],b[i]中的元素值与i想等。
解题函数:快排函数sort(数组名,数组名+数组长度)
桶排
#include <bits/stdc++.h> using namespace std; int main(){ int n,t; cin>>n; int mark=1; int a[n],b[n]={0}; for(int i=1;i<=n;i++){ cin>>a[i];} for(int i=1;i<n;i++){ t=abs(a[i]-a[i+1]); b[t]=1; } for(int i=1;i<n;i++){ if(b[t]==0){ mark=0; break;} } if(mark) cout<<"Jolly"<<endl; else cout<<"Not Jolly"<<endl; return 0;}解题思路:首先使数组b中的元素全部设为0;求出t代表连续不断的数,再令t变成数组b的下标,使数组b中的元素变为1;如果数组中仍有元素为0;则说明这个数组不是欢乐的跳。
