題意:**有乙個能力值\(s_i\)和k個屬性值\(x_i\),要求從主**,副**兩個集合中各挑選一把使得評分最高。評分的指二者的s值之和,及二者各項屬性值的差的絕對值的和
分析:在做這道題前,可以先考慮poj 2926
求的是5維的n個點最遠點對的距離
我們先從只有一維的情況考慮起。只需要獲得該維的最大值,最小值,做差即可。
再考慮二維的情況,我們是否能夠化為乙個形式,使得無需考慮絕對值,直接用最大最小值做差呢
|x1-x2|+|y1-y2|, 必然為以下四者中的一種
(x1-y1)-(x2-y2) , (x1+y1)-(x2+y2), (-x1-y1)-(-x2-y2), (-x1+y1)-(-x2+y2)
注意到括號內形式相同,也就是說,對於二維的情況,我們分四種情況討論,分別求出最值,最後做差即可。
同理推廣到五維
在寫法上可利用數字表示狀態
#include #include #include using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const double inf = 1e12;
int n;
double a[maxn][5];
double ans, _min, _max;
int main()
} ans = 0;
for (int s = 0; s < (1 << 5); s++)
_min = min(_min, t);
_max = max(_max, t);
}ans = max(ans, _max - _min);
} printf("%.2lf\n", ans);
} return 0;
}
在考慮原題,考慮s應為相加的條件,我們如何利用已有結論呢?
顯然將主**的s取為負數即可, 那麼問題則變為k+1維。
同時為了保證求得的最遠點對分別屬於兩個集合,主**的s再減去乙個足夠大的數即可
#include #include #include using namespace std;
typedef long long ll;
int n, m, k;
const ll dep = 1e12;
const ll inf = 1e14;
const int maxn = 2e5 + 10;
ll wp[maxn][6];
ll ans, _min, _max;
int main()
wp[i][0] = -dep - wp[i][0];
} for (int i = 0; i < m; i++)
} ans = 0;
for (int s = 0; s < (1 << (k + 1)); s++)
_min = min(_min, t);
_max = max(_max, t);
}ans = max(ans, _max - _min);
} printf("%lld\n", ans - dep);
} return 0;
}
hdu 6435 CSGO 曼哈頓距離性質
你有n把主 m把副 現在你要各選一把。每把 有乙個基礎能力值和k各引數。你需要使你的兩把 的基礎值之和加各個能力值的絕對值之和最大。先只考慮能力值 如 a1 b1 a2 b2 a3 b3 約掉絕對值之後根據a1 a3和b1 b3的值,原式的每個數字的符號有2 3種可能性。但是只有一種符號分配的方式能...
hdu 求平均成績
假設乙個班有n n 50 個學生,每人考m m 5 門課,求每個學生的平均成績和每門課的平均成績,並輸出各科成績均大於等於平均成績的學生數量。input 輸入資料有多個測試例項,每個測試例項的第一行包括兩個整數n和m,分別表示學生數和課程數。然後是n行資料,每行包括m個整數 即 考試分數 outpu...
hdu 1394 求逆序數(線段樹求)
題意描述 給你乙個有0 n 1數字組成的序列,然後進行這樣的操作,每次將最前面乙個元素放到最後面去會得到乙個序列,那麼這樣就形成了n個序列,那麼每個序列都有乙個逆序數,找出其中最小的乙個輸出!解析 求出a1,a2,an 1,an的逆序數之後,就可以遞推求出其他序列的逆序數。假設要把a1移動到an之後...