美团笔试 3.26 C++ 一些疑惑的地方
第二题 求圆环面积
我用的C++,对半径排序了,也用了<math>里面的M_PI,但是还是只有18%,有没有大佬帮忙看一下。
#include<iostream> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<iomanip> using namespace std; int main(){ int n=0; cin>>n; vector<long> redis(n,0); for(int i=0; i<n; i++){ cin>>redis[i]; } if(n<=0){ cout<<0<<endl; return 0; } if(n==1){ double tmp = M_PI*redis[0]*redis[0]; cout<<fixed<< setprecision(5)<<tmp<<endl; return 0; } sort(redis.begin(),redis.end()); long sum=0; for(int i=0; i<n-1; i=i+2){ sum = sum + (redis[i] + redis[i+1])*(redis[i]-redis[i+1]); } if(n&0x1==1){ sum+=redis[n-1]*redis[n-1]; } double ans = M_PI*sum; cout<<fixed<< setprecision(5)<<ans<<endl; return 0; }
第三题 用的是线性DP,但是会TLE,感觉第二个循环里面可以做优化,尝试了做了一个剪枝,没有来得及做步长的优化,又有大佬分享一下经验
#include<iostream> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<iomanip> using namespace std; #define MAGIC 998244353 int main(){ int n=0; cin>>n; vector<int>num(n); for(int i=0;i<n;i++){ cin>>num[i]; } vector<int> dp(n,0); dp[0]=1; for(int i=1; i<n; i++){ int step=1; int first=true; for(int j=0; j<=i; j=j+step){ if((j+1)>(num[i]+1)/2) break; if(num[i]%(j+1)==0){ if(j==0){ dp[j] = dp[j]+1; }else{ dp[j] = dp[j]+dp[j-1]; } if(first && (j+1) !=1){ step = j+1; } } } } int res=0; for(int i=0; i<n; i++){ res = (res+dp[i])%MAGIC; } cout<<res<<endl; }