題解按照條件求解出最大的三角形和最小的三角形,然後求重心即可。
這裡求解面積有兩種方法:
海**式: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
變成了4
和3
,如此用乙個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...