数字比较
思路:签到题,这题应该是高中数学考试基本必考的一题,思路很简单,本来想用矩阵快速幂的,但发现a,b都很大,矩阵快速幂肯定爆,既然会爆掉。然后,我们用对数来转换,开longlong就不会爆了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int x,y;
cin>>x>>y;
ll a=y*log(x); //巧妙转换,指数换对数
ll b=x*log(y);
if(a>b) cout<<">"<<endl;
else if(a==b) cout<<"="<<endl;
else cout<<"<"<<endl;
return 0;
}收集纸片
思路:我们发现由于坐标的范围比较小,所以可以用暴力枚举法来求解,这里可以利用的是全排列,也就是将这n个纸片所在的点的顺序都进行一次排列,然后,对于每种排列的情况都进行计算依次走过这n个点的距离,取最小的即可。
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}Node[30];
int p[30],mi=1e3;
int n,l,w,a,b;
void calc(){
int ans=abs(a-Node[p[0]].x)+abs(b-Node[p[0]].y);
for(int i=1;i<n;i++){ //枚举依次走过这n个点的距离,找出最小值
ans=ans+abs(Node[p[i]].x-Node[p[i-1]].x)+abs(Node[p[i]].y-Node[p[i-1]].y);
if(ans>mi) return;
}
mi=min(mi,ans+abs(a-Node[p[n-1]].x)+abs(b-Node[p[n-1]].y));
}
int main(){
int t;
cin>>t;
while(t--){
cin>>l>>w>>a>>b;
cin>>n;
for(int i=0;i<n;i++){
cin>>Node[i].x>>Node[i].y;
p[i]=i;
}
do{
calc();
}while(next_permutation(p,p+n));
cout<<"The shortest path has length "<<mi<<endl;
}
return 0;
}
京公网安备 11010502036488号