数字比较
思路:签到题,这题应该是高中数学考试基本必考的一题,思路很简单,本来想用矩阵快速幂的,但发现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; }