UVALive 5873 (幾何 思維)

2021-09-07 06:07:30 字數 1709 閱讀 3163

唉 被秀了。。。 還是太弱,說好的數形結合呢,列個式子出來後就被嚇到了,然後就懵逼了。

題意:有一條狗,從原點出發,沿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...