說明:
在數學中有個公式:
(a1-b1)^2+(a2-b2)^2<(a2-b1)^2+(a1-b2)^2
(你可以自己試著證一下)
兩列火柴對應的兩根火柴在各列中高度的排序應該相同
再申請乙個r陣列,使得r[a[i].num]=b[i].num
然後,顯而易見,本題得解。
#include
#include
反抄襲系統
using
namespace
std;
struct
huochai
a[100001],b[100001];
int n;
intread
() int h=0;
while(ch<='9' && ch>='0')
return h;
}int
my(const huochai&a,const huochai&b)
else
} int c[100001],r[100001],tot=0;
void
merge_sort
(int left,int right)
int mid=(right+left)/2,x=left,y=mid+1,t=left;
merge_sort(left,mid);
merge_sort(mid+1,right);
while(x<=mid&&y<=right)
else
c[t++]=r[x++];
}while(x<=mid)
while(y<=right)
for(int w=left;w<=right;w++)
}int
main
() for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
sort(a+1,a+n+1,my);
sort(b+1,b+n+1,my);
for(int i=1;i<=n;i++)
merge_sort(1,n); 反抄襲系統
printf("%d",tot);
return
0; }
洛谷 P1966 火柴排隊
題目描述 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交...
洛谷P1966 火柴排隊
涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 sum a i b i 2 其中a i表示第一列火柴中第 i 個火柴的高度,b i表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交...
洛谷P1966 火柴排隊
火柴排隊 感覺比較順理成章地就能推出來?似乎是個一眼題 交換的話多半會往逆序對上面想,然後題目給那個式子就是拿來嚇人的根本沒有卵用 唯一的用處大概是告訴你考慮貪心一波,很顯然有兩個序列中每對排名對應的數放在同一位置上是最優策略這個結論 說詳細一點,假設 a 0 是 a 序列中的第 k 大,b 0 是...