Offer收割 程式設計練習賽26

2021-08-09 08:41:39 字數 4422 閱讀 8811

題解

按照條件求解出最大的三角形和最小的三角形,然後求重心即可。

這裡求解面積有兩種方法:

海**式:p(

p−a)

(p−b

)(p−

c)−−

−−−−

−−−−

−−−−

−−−√

,將三角形的每一條邊求解出來,然後進行處理

用有向向量進行計算,如果設a(

x0,y

0),b(

x1,y

1),c(

x2,y

2)三點為三角形三個頂點,

a 為有向面積,那麼2a

=∣∣∣

∣∣x0

x1x2

y0y1

y211

1∣∣∣

∣∣=x

0y1+

x2y0

+x1y

2−x2

y1−x

0y2−

x1y0

然後需要注意就是針對浮點數判斷要進行誤差處理ep

s=10−

8 就可以了。

**

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int mod = 1e9 + 7;

const

int maxn = 50 + 5;

const

int maxm = 5e6 + 5;

const

int inf = 0x3f3f3f3f;

const

double eps = 1e-10;

int n, u;

struct point p[maxn];

int a[2][3];

double area(double x0, double y0, double x1, double y1, double x2, double y2)

pair getzx(int i, int j, int k)

int main()

memset(a, 0, sizeof(a));

double max_area = -1;

double min_area = (ll)inf * inf * 2.;

for(int i = 0; i < n; i ++)

if(min_area - cur_area > eps ||

fabs(min_area - cur_area) <= eps && (t***.first - tmp1.first > eps ||

fabs(t***.first - tmp1.first) <= eps && t***.second - tmp1.second > eps)) }}

}pair a = getzx(a[0][0], a[0][1], a[0][2]);

pair b = getzx(a[1][0], a[1][1], a[1][2]);

double ret = (a.second - b.second) * (a.second - b.second) + (a.first - b.first) * (a.first - b.first);

printf("%.2f\n", sqrt(ret) / (2. * u));

}}

題解

兩種思維方式

直接處理,也就是說用乙個map或者set來儲存每一次的操作,比如說我向00000000插入5,變成了0000x000也就是說把8變成了43,如此用乙個map存起來,如果當前有乙個值等於k就輸出結果即可

用轉正為負的方法,我們開始是不斷往空的盆子裡放花,現在變成了不斷從盆子裡拿花,我們將處理資料離線處理,然後從n-1次操作往前處理,很明顯0會不斷增多,這樣就有點類似於並查集了,我們合併連在一起的0,當這個合併的值等於k的時候是不是就是答案,當然我們必須找到最接近開始的操作

**(map,set)

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int mod = 1e9 + 7;

const

int maxn = 1e5 + 5;

const

int maxm = 5e6 + 5;

const

int inf = 0x3f3f3f3f;

const

double eps = 1e-10;

int n, k;

set a;

int main()

a.insert(x);

}printf("%d\n", t + 1);

}return

0;}

**(並查集)

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int mod = 1e9 + 7;

const

int maxn = 2e5 + 5;

const

int maxm = 5e6 + 5;

const

int inf = 0x3f3f3f3f;

const

double eps = 1e-10;

int n, k;

int par[maxn];

int cnt[maxn];

int a[maxn];

void init()

int _find(int x)

int unit(int a, int b)

int main()

if(a[i] + 1

<= n && cnt[a[i] + 1])

if(tmp == k) kt ++;

if(kt > 0) ret = i;

//if(kt != -1) ret = kt;

}printf("%d\n", ret);

}return

0;}

題解

將菱形轉換為正方形,經典的針對求解曼哈頓距離的方法

**

#include 

#include

#include

using

namespace

std;

const

int maxn = 2e2 + 5;

int s[20 + 5][maxn << 1][maxn << 1];

int a[maxn << 1][maxn << 1];

int n;

int sum(int v, int x0, int y0, int x1, int y1)

int main()

}int max_v = 0;

for(int i = 1; i <= 20; i ++) }}

int q;

scanf("%d", &q);

int y, k;

while(q --)

printf("%d\n", ret);}}

return

0;}

Offer收割 程式設計練習賽1

做了三題,題目都比較暴力。a題 題意 給你乙個三階的幻方,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。現在準備將乙個三階幻方中的一些陣列抹掉 0代替 交給你來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。如果只有一組解,輸出該三階幻方...

Offer收割 程式設計練習賽7

比較容易想到是o n 2 的解決方案,遍歷n種刪除可能,每次遍歷o n 時間求總高度。前者優化比較困難,因而想辦法優化每次遍歷求高度的時間。由前往後遍歷,當刪除第i個時,先前的排版是連續的,從而通過計數器等累加方法可以求得已完整行的總高度presum,以及當前未完整行的w,h。include def...

Offer收割 程式設計練習賽30

題解 簡單的模擬題,大家懂的 include include include include include include include include include define fin freopen input.txt r stdin define fout freopen output...