日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 1455E Four Points(数学+几何)

發(fā)布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1455E Four Points(数学+几何) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出四個點(diǎn),問最少移動多少步,可以使得四個點(diǎn)圍成的矩形是正方形(這里的正方形允許退化成點(diǎn))

題目分析:比賽時寫了個三分,然鵝又雙叒叕不知道哪里寫崩了,還是太鶸了呀

首先對于四個點(diǎn)全排列,枚舉每個點(diǎn)分別屬于正方形的哪個位置,方便起見我設(shè):p[ 0 ] 是左上角,p[ 1 ] 是右上角,p[ 2 ] 是左下角,p[ 3 ] 是右下角

不難看出 x 坐標(biāo)與 y 坐標(biāo)是相互獨(dú)立的,所以這里只討論如何求解最優(yōu)的 x,關(guān)于 y 的話類比過去就好了

對于最終的正方形來說,p[ 0 ] 和 p[ 2 ] 的 x 坐標(biāo)最終一定是相等的,同理 p[ 1 ] 和 p[ 3 ] 的 x 坐標(biāo)也一定是相等的,我們將最終相等的兩個 x 坐標(biāo)分別記為 x1 和 x2

所以具象化一下最終的距離公式為:

不難看出,如果滿足?時,p[ 0 ] 和 p[ 2 ] 的貢獻(xiàn)最小,為?,對于 x2 同理

所以正方形上下兩條平行于 x 軸的邊的長度為?,其取值范圍根據(jù) x1 和 x2 的定義域也不難推出

同理求出?,注意,這兩個絕對值對應(yīng)的分別是正方形邊長的取值范圍,然后分兩種情況討論一下:

  • 如果和存在交集的話,那么一定存在著一種取值作為正方形的邊長,使得答案為
  • 如果和不存在交集的話,那么需要使或中的一個不在“貢獻(xiàn)最小”的范圍內(nèi),針對于 x 討論一下,如果離開這個最優(yōu)范圍 1 個單位,會對答案多貢獻(xiàn) 2 個單位(因?yàn)槊織l邊需要有兩個點(diǎn)與其對齊)
  • 剩下的封裝一下函數(shù)然后按照順序?qū)崿F(xiàn)下來就好了

    代碼:

    //#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=1e6+100;struct Node {LL x,y;void input(){scanf("%lld%lld",&x,&y);} }p[4];int id[4];pair<LL,LL>get_seg(LL a,LL b) {return make_pair(min(a,b),max(a,b)); }pair<LL,LL>get_interval(pair<LL,LL>a,pair<LL,LL>b) {return make_pair(max({0LL,a.first-b.second,b.first-a.second}),max({0LL,b.second-a.first,a.second-b.first})); }LL get_len(pair<LL,LL>a) {return a.second-a.first; }int main() { #ifndef ONLINE_JUDGE // freopen("data.ans.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){for(int i=0;i<4;i++){p[i].input();id[i]=i;} // 01 // 23LL ans=inf;do{LL cur=0;auto x1=get_seg(p[id[0]].x,p[id[2]].x);auto x2=get_seg(p[id[1]].x,p[id[3]].x);auto Seg_x=get_interval(x1,x2);cur+=get_len(x1)+get_len(x2);auto y1=get_seg(p[id[0]].y,p[id[1]].y);auto y2=get_seg(p[id[2]].y,p[id[3]].y);auto Seg_y=get_interval(y1,y2);cur+=get_len(y1)+get_len(y2);LL delta=max(max(Seg_x.first,Seg_y.first)-min(Seg_x.second,Seg_y.second),0LL);cur+=2*delta;ans=min(ans,cur);}while(next_permutation(id,id+4));printf("%lld\n",ans);}return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的CodeForces - 1455E Four Points(数学+几何)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。