唉 被秀了。。。 還是太弱,說好的數形結合呢,列個式子出來後就被嚇到了,然後就懵逼了。
題意:有一條狗,從原點出發,沿n個向量走,每個向量只走一次,沿著乙個向量(x,y)走時,既可以往(x,y)方向走,也可以往(-x,-y)方向走。 然後問這條狗離原點最遠的距離。
如果寫成方程:
n個向量分別表示為: (x1,y1) (x2,y2) (x3,y3) ... (xn,yn)
第i個向量往(xi,yi)方向則ai=1,否則ai=-1
則ans = (a1*x1+a2*x2+...+an*xn)^2 + (a1*y1+a2*y2+...+an*yn)^2
要你給出乙個(a1,a2,...,an)使得ans最大。
我以為寫出方程形式會有助於做題,然並卵。。。
這題還是要用直觀的方法理解。。。
數形結合方法:
定理1:如果把乙個向量的正方向和反方向都算上,那麼最優解的n個向量必然在乙個半平面內。
證明: 假設最優解中的n個向量不在乙個半平面內,一定可以找到乙個直線l,使得直線左右兩邊都存在向量,那麼將直線l左邊的向量都轉變為其反向量,那麼結果一定大於最優解。
定理2: 如果把乙個向量的正方向和反方向都算上,並以對x正半軸夾角排序,則連續的n個向量必兩兩不同(即不會存在乙個向量的正向量和反向量都存在的情況)。
證: 顯然。
由這兩個定理,那麼這題就很好做了,把所有的(xi,yi)(-xi,-yi)都算上,然後進行極角排序,列舉連續的n個記錄最大值即可。
#include #include#include
#include
#include
using
namespace
std;
#define n 110
const
double pi = acos(-1.0);//
pistruct
node
g[2*n];
double getangle(double x,double
y)double dis(int x,int
y)int
cmp(node t1,node t2)
//泥煤,完全想錯了。。。
int main(int argc, const
char *argv)
sort(g,g+cnt,cmp);
intpi,pj;
pi=0
;
double ans=0
;
for(;pi)
ans=max(ans,dis(x,y));
}/*ans*=10000;
int tmp=((long long)ans)%10;
ans/=10;
if(tmp>5) ans++;
ans/=1000;
char strans[110];
sprintf(strans,"%lf",ans);
for(int i=0;i<100;i++)
break;
}else printf("%c",strans[i]);
}printf("\n");
*/printf(
"%.3lf\n
",ans);
}return0;
}
ps:最後題目中說的四捨五入是扯淡,直接%.3lf即可。
UVALive 4650 平面幾何
題意 給出n個點,每個點有點權,要畫兩個圓,每個圓圈中某些點 兩個圓圈中 的點不能相交 兩個圓圈中的點求和再相乘求最大值。有個很關鍵的條件是三點不 共線。相當於一條直線分成兩堆點 兩側 使得兩側和的乘積最大。直接列舉兩個點定下 一條直線,那麼直線上的兩個點有四種情況,同側兩種異側兩種。include...
Kadj Squares 幾何思維
kadj squares 題意 不斷加45 角站立的正方形,在互不相交的情況下,使得每個正方形底端點盡量靠左,求在上方視角可以看到的正方形編號 解法 l i r i x i 分別表示 i正方形的左端點 右端點 邊長 因為每個新正方形 i 總會和另外乙個正方形 j 的一條邊重合,由此可計算新正方形左端...
Kadj Squares 計算幾何思維
題意 給你幾個正方形的邊長,把這些正方形按順序放入直角座標系的第一象限,其中邊長與x y軸成45度角。可以有重合邊,但不能有重合面積。問從 y 軸上方看可以看到那些正方形。思路 先確定每個正方形的左右端點,再判斷那些正方形被覆蓋。include include include using names...