Đề này có thể đem hình vuông chuyển hóa vì đoạn thẳng, nếu có thể thấy cái này đoạn thẳng, là có thể thấy cái này hình vuông, cái này đoạn thẳng tả hữu hai cái điểm cuối phân biệt vì đề ý theo như lời hình vuông nhất tả cùng nhất hữu hai cái đỉnh điểm.
Sau đó phân thành hai bước:
1. Đem sở hữu hình vuông chuyển hóa vì đoạn thẳng, mỗi một cái mặt sau đoạn thẳng đều là thông qua cùng phía trước sở hữu đoạn thẳng cầu tương đối vị trí quan hệ, sau đó tìm ra lớn nhất một cái.
2. Căn cứ mỗi điều đoạn thẳng độ cao phán đoán che đậy quan hệ. Tỷ như chúng ta yêu cầu mỗ một cái đoạn thẳng hay không bị che đậy, chúng ta hẳn là cầu này đoạn thẳng bên trái sở hữu đoạn thẳng hữu điểm cuối giá trị hay không lớn hơn này đoạn thẳng bên phải tả điểm cuối giá trị, nếu lớn hơn hoặc bằng thả độ cao cũng lớn hơn này đoạn thẳng tắc che đậy, nếu không không có che đậy.
Trình tự như sau:
#include <iostream>
#include<math.h>
#include<string.h>
using namespace std;
struct line{
double x1,x2,y;
};
int eps(double m,double n){
if(fabs(m-n)<=1e-8) return 0;
else if(m>n) return 1;
else return -1;
}
line le[60];
double a[60];
bool vis[60];
const double sq=sqrt(2.0);
int n;
int main()
{
while(cin>>n&&n!=0){
memset(vis,true,sizeof(vis));
for(int i=1;i<=n;i++){
cin>>a[i];
le[i].y=a[i]/sq;
}
le[1].x1=0;
le[1].x2=sq*a[1];
for(int i=2;i<=n;i++){
double maxx=-1e8;
double d;
for(int j=1;j<i;j++){
if(a[j]>=a[i]){// nếu phía trước hình vuông so mới gia nhập hình vuông biên lớn lên
d=(le[j].x1+le[j].x2)/2+a[i]/sq;// thông qua trước một cái hình vuông hình thành đoạn thẳng đẩy ra sau một cái đoạn thẳng biểu đạt công thức
if(maxx<d) maxx=d;// tìm ra lớn nhất tả điểm cuối
}else{// nếu phía trước hình vuông so mới gia nhập hình vuông biên trường tiểu
d=le[j].x2+a[j]/sq-a[i]/sq;
if(maxx<d) maxx=d;
}
}
le[i].x1=maxx;
le[i].x2=maxx+sq*a[i];
}
for(int i=1;i<=n;i++){
double maxx1=le[i].x1;// này đoạn thẳng tả điểm cuối
double minn2=le[i].x2;// này đoạn thẳng hữu điểm cuối
for(int j=1;j<i;j++){
if(le[j].x2>maxx1&&le[j].y>le[i].y) maxx1=le[j].x2;// ở cái này hình vuông phía trước hình vuông tả hữu hai điểm cuối hình thành đoạn thẳng nhất hữu điểm cuối giá trị
}
for(int j=i+1;j<=n;j++){
if(le[j].x1<minn2&&le[j].y>le[i].y) minn2=le[j].x1;// ở cái này hình vuông lúc sau hình vuông tả hữu hai điểm cuối hình thành đoạn thẳng nhất tả điểm cuối giá trị
}
}
if(eps(maxx1,minn2)>=0) vis[i]=false;
}
for(int i=1;i<=n;i++){
if(vis[i]) cout<<i<< "";
}
cout<<endl;
}
return 0;
}