題目點這裡
題目大意:
有兩列火柴,給出他們的根數和他們對應的長度ai,bi,並且規定距離為
解題思路:
怎麼使距離最小?哈哈哈哈,是在兩個佇列裡面的火柴相對應(a集合火柴中第i小對應b集合中第i小),將兩個集合排序(為了讓ab相對應),因為排好序a,b是最小的,所以a下標與b下標就要對應;
然後按照a去處理b,開乙個陣列c,c[a[i].point] = b[i].point;陣列c中的下標為a[i]的下標,對應的值是b[i]的下標;
舉乙個例子:
a:4 5 6 1 3 7 ->a':1 3 4 5 6 7
b:5 3 2 1 7 6 ->b':1 2 3 5 6 7
c: 2 1 6 4 3 5
很明顯要求c陣列的逆序對數啊!逆序對數用什麼?樹狀陣列!
**如下:
#include #include #include #include #include #define lowbit(i) i&-i
#define maxn 100005
using namespace std;
int c[maxn],action[maxn];
int n,ans;
struct node
int main()
for(int i = 1;i <= n;i++)
sort(matchone+1,matchone+n+1);
sort(matchtwo+1,matchtwo+1+n);
for(int i = 1;i <= n;i++)
action[matchone[i].point] = matchtwo[i].point;
for(int i = 1;i <= n;i++)
cout<
NOIP2013 D1 T2火柴排隊
涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...
noip2013 d1t2 火柴排隊
看不出是逆序對.感覺藥丸 首先要看出最優解就是兩個陣列均有序的時候 再對兩個陣列的下標求逆序對即可 歸併 樹狀陣列 1 include2 include3 include4 include5 include6 define modd 99999997 7using namespace std 8co...
NOIP2013D1T2 火柴排隊 題解
題目描述略 對於距離最小,其貪心策略為將兩序列公升序排序後比較。以下為簡易的證明 設對任意 a1 a2,b1 b2,第一種排布是 a1a2.b1b2.此時距離為 a1 b1 2 a2 b2 2 1 第二種排布是 a1a2.b2b1.此時距離為 a1 b2 2 a2 b1 2 2 用 1 式減去 2 ...