有 n 座摩天大楼等间距地排成了一排,你对从哪座摩天大楼的顶端欣赏风景这个问题很感兴趣。每一座摩天大楼都可以被抽象为一条在二维平面上的一条线段。你现在知道第 i 座大楼的高度为 hi ,对应在二维平面上就是(i , 0)到(i , hi)的一条线段。
你现在想到能看到最多楼顶的大楼去,从第 i 座大楼能看到第 j 座大楼当且仅当连接这两个楼顶的线段不与任何其他高楼对应的线段接触或相交。现在要请选择一座能看到最多其他楼顶的大楼。
有 n 座摩天大楼等间距地排成了一排,你对从哪座摩天大楼的顶端欣赏风景这个问题很感兴趣。每一座摩天大楼都可以被抽象为一条在二维平面上的一条线段。你现在知道第 i 座大楼的高度为 hi ,对应在二维平面上就是(i , 0)到(i , hi)的一条线段。
你现在想到能看到最多楼顶的大楼去,从第 i 座大楼能看到第 j 座大楼当且仅当连接这两个楼顶的线段不与任何其他高楼对应的线段接触或相交。现在要请选择一座能看到最多其他楼顶的大楼。
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n (1 ≤ n ≤ 60) , 接下来一行有 n 个整数 hi 表示第 i 座大楼的高度( 1 ≤ ai ≤ 1000000000)。
输出一个数,代表你最多能看到的其他楼顶数量。
对于样例,从第 3 座大楼楼顶可以看到其他所有楼顶。
5 1 2 7 3 2
4
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; vector<int> a(n,0); for (int i=0;i<n;i++){ cin>>a[i]; } //cout<<a.size()<<" "<<a[13]<<endl; int res = 0; for (int i=0;i<n;i++){ int ress= 0; int l = i-1; double ll1 = 100000000000000; while (l>=0){ double kk =double((a[i]-a[l]))/double((i-l)); if (kk<ll1){ ll1 = kk; ress ++; } l --; } //cout<<i<<" "<<ress<<endl; int r = i+1; double rr1 = 100000000000000; while(r<n){ double kk = double((a[i]-a[r]))/double((r-i)); if (kk<rr1){ rr1 = kk; ress ++; } r ++; } //cout<<i<<" "<<ress<<endl; res = max(res,ress); } cout<<res; }
#include<iostream> #include<vector> #include<unordered_map> using namespace std; int main(){ int n,m; cin >> n; vector<int> a(n); for(int i = 0;i < n;++i){ cin >> a[i]; } unordered_map<int,int> b; for(int i = 0;i < n-1;++i){ double kk = a[i+1] - a[i] - 1; for(int j = i + 1;j < n;++j){ double temp = (a[j] - a[i]) / (double)(j - i); if(temp > kk){ kk = temp; b[i]++; b[j]++; } } } int res = 0; for(auto [i,j]:b){ res = max(res,j); } cout << res << endl; return 0; }
#include<iostream> #include <algorithm> using namespace std; int solve(int s,int n,const double* v){ int sum=0; double max_k=*max_element(v,v+ n)+1; double min_k=*min_element(v,v+ n)-*max_element(v,v+ n)-1; double k=max_k; for(int i=s-1;i>=0;i--){ if ( (v[s]-v[i])/(s-i)<k ) { k=(v[s]-v[i])/(s-i); sum++; } } k=min_k; for(int i=s+1;i<n;i++){ if ( (v[s]-v[i])/(s-i)>k ) { k=(v[s]-v[i])/(s-i); sum++; } } return sum; } int main() { double v[1000]; int n; cin>>n; for(int i=0;i<n;i++){ cin>>v[i]; } int m[1000]; for (int i=0;i<n;i++){ m[i]=solve(i,n,v); } int max=-1; for (int i=0;i<n;i++){ if (max<m[i])max=m[i]; } cout<<max<<endl; return 0; }
#include<iostream> #include<vector> using namespace std; class Solution{ public: int maxRoof(vector<int> vec){ int ret=0; if(vec.size()<=1) return 0; for(int i=1;i<=vec[0];i++){ int tmpsize=0; for(int j=1;j<=vec[0];j++){ if(j==i) continue; int ii=min(i,j); int jj=max(i,j); float k=float(vec[jj]-vec[ii])/(jj-ii);// 斜率 float b=vec[jj]-k*jj;//偏置 ii++; bool flag=true; while(ii<jj){ if(float(vec[ii]>=(k*ii+b))) { flag=false; break; } ii++; //xie'l } if(flag) tmpsize++; // i - j 区间内都满足 } ret=max(ret,tmpsize); } return ret; } }; int main(){ int n; cin >> n; vector<int> vec(n+1, 0); vec[0]=n; for (int i = 1; i <= n; i++) { cin >> vec[i]; } Solution sol; int ret=sol.maxRoof(vec); cout<<ret; return 0; }
#include<iostream> using namespace std; int n; int a[60]; int cou = 0; int Slop() { int lcou = 0; for (int i = 0; i < n; i++) { int rcou = 0; int Ji = i - 1; double ss = 1000000000000; while (Ji >= 0) { double sl = double(a[i] - a[Ji]) / (i - Ji); if (sl < ss) { ss = sl; rcou++; } Ji--; } Ji = i + 1; ss = -100000000000; while (Ji < n) { double sl = double(a[i] - a[Ji]) / (i - Ji); if (sl > ss) { ss = sl; rcou++; } Ji++; } if (lcou<rcou) lcou = rcou; } cout << lcou; return 0; } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } Slop(); return 0; }
#include<bits/stdc++.h> using namespace std; struct Point{ long long x,y; Point(){ x=0,y=0; } Point(long long _x,long long _y):x(_x),y(_y){} long long operator ^(const Point &b)const{ return x*b.y-y*b.x;}//叉积 Point operator -(const Point &b)const { return Point(x-b.x,y-b.y);} }; const int maxn=1e5+10; long long a[maxn]; int num[maxn]; int32_t main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ Point aa; aa.x=i; aa.y=a[i]; Point bb; bb.x=j; bb.y=a[j]; bool f=1; for(int x=i+1;x<j;x++){ Point cc; cc.x=x; cc.y=0; Point dd; dd.x=x; dd.y=a[x]; Point aaa=cc-aa; Point bbb=cc-bb; Point ccc=dd-aa; Point ddd=dd-bb; if( (aaa^bbb) == 0 || (ccc^ddd)==0) { f=0; } else if( (aaa^bbb) < 0 && (ccc^ddd) > 0) { f=0; } else if( (aaa^bbb) > 0 && (ccc^ddd) < 0 ) { f=0; } } if(f){ num[i]++; num[j]++; } } } int t=0; for(int i=1;i<=n;i++) t=max(t,num[i]); cout<<t<<endl; }