锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆愰瑙c戯細寰堟槑鏄劇湅鍒版槸姹備竴棰楁渶灝忕敓鎴愭爲錛屼笉榪囨湁涓涓檺鍒跺氨鏄垰鍒氬ソ鏈塳鏉¤竟鏄疉鍏徃鐨勩傛兂浜嗗緢涔呬笉浼氬仛錛岀湅鍒漢浠g爜鐨勩備簩鍒嗗嚭涓涓渶澶у糳elta浣垮緱A鍏徃鐨勮竟鍔犱笂榪欎釜鍊煎悗鍐嶆眰MST鏃禔鍏徃鐨勮竟鏈夊ぇ浜庣瓑浜巏鏉★紝鐒跺悗絳旀灝辨槸cost of MST - k * delta銆傛濇兂鍏跺疄鏄姞涓婁竴涓猟elta鍊煎幓閫艱繎絳旀錛屾渶鍚庡彲浠ユ眰鍑鴻繖鏍風殑MST錛屽鏋滄渶鍚庢眰鍑虹殑MST鐨凙鍏徃鐨勮竟澶氫簬k鏉★紝涓瀹氬瓨鍦ㄤ笌A鍏徃絳夋晥涓旂瓑浠風殑B鍏徃杈癸紝鏇挎崲榪囨潵鍗沖彲銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 #include "set"
13 #include "utility"
14 using namespace std;
15 typedef pair<int, int> pii;
16 #define pb push_back
17 #define mp make_pair
18 #define fi first
19 #define se second
20 #define sof(x) sizeof(x)
21 #define lc(x) (x << 1)
22 #define rc(x) (x << 1 | 1)
23 #define lowbit(x) (x & (-x))
24 #define ll long long
25 struct Edge {
26 int u, v, w, id;
27 Edge(){}
28 Edge(int _u, int _v, int _w, int _id) {
29 u = _u, v = _v, w = _w, id = _id;
30 }
31 bool operator<(const Edge &x) const {
32 if(w != x.w) return w < x.w;
33 else return id < x.id;
34 }
35 }et[2][100050], e;
36 int tot, tot1;
37 int n, m, k, cost;
38 int fa[50050];
39
40 int find(int x) {
41 return (x == fa[x]) ? x : fa[x] = find(fa[x]);
42 }
43
44 bool merge(int u, int v) {
45 u = find(fa[u]), v = find(fa[v]);
46 if(u != v) {
47 fa[u] = v;
48 return true;
49 } else return false;
50 }
51
52 bool check(int w) {
53 cost = 0;
54 int cnt = 0;
55 for(int i = 0; i < n; i++) fa[i] = i;
56 int i = 0, j = 0;
57 while(i < tot || j < tot1) {
58 if(et[0][i].w + w <= et[1][j].w) {
59 e = et[0][i++];
60 e.w += w;
61 } else e = et[1][j++];
62 if(merge(e.u, e.v)) {
63 if(!e.id) cnt++;
64 cost += e.w;
65 }
66 }
67 return cnt >= k;
68 }
69
70 int main() {
71 int Case = 1;
72 while(~scanf("%d%d%d", &n, &m, &k)) {
73 tot = tot1 = 0;
74 for(int i = 0; i < m; i++) {
75 int u, v, w, id;
76 scanf("%d%d%d%d", &u, &v, &w, &id);
77 if(id) et[1][tot1++] = Edge(u, v, w, id);
78 else et[0][tot++] = Edge(u, v, w, id);
79 }
80 sort(et[0], et[0] + tot);
81 sort(et[1], et[1] + tot1);
82 et[0][tot].w = et[1][tot1].w = 1 << 30;
83 int l = -100, r = 100;
84 int w;
85 while(l <= r) {
86 int mid = (l + r) / 2;
87 if(check(mid)) w = mid, l = mid + 1;
88 else r = mid - 1;
89 }
90 check(w);
91 printf("Case %d: %d\n", Case++, cost - w * k);
92 }
93 return 0;
94 }
95
銆愰瑙c戯細鏈澶у兼渶灝忛棶棰橈紝鍩烘湰涓婂氨鏄簩鍒嗙瓟妗?鍒ゅ畾銆?br /> 榪欓鐨勫垽瀹氶渶瑕佺敤鍒版爲dp銆?br /> 璁劇姸鎬乨p[u]涓轟互u涓烘牴鐨勫瓙鏍戝垏鍘誨叾涓嬫柟鍙跺瓙鑺傜偣鐨勬渶灝戜唬浠楓?br /> 闈炲彾瀛愯妭鐐癸細
dp[u] += min(dp[v], w(u, v)), v 涓?u 鍎垮瓙銆?br /> 鍙跺瓙鑺傜偣錛?br /> dp[u] = inf;
鏈鍚庡垽鏂璬p[1]涓巑鐨勫叧緋誨氨鍙互浜嗐?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define mp make_pair
15 #define fi first
16 #define se second
17 #define lc(x) (x << 1)
18 #define rc(x) (x << 1 | 1)
19 #define lowbit(x) (x & (-x))
20 #define ll long long
21 #define maxn 1010
22 const int inf = 1 << 20;
23 int n, m, limit;
24 int dp[maxn];
25 struct Edge {
26 int v, w;
27 Edge(){}
28 Edge(int _v, int _w) {
29 v = _v, w = _w;
30 }
31 };
32 vector<Edge> vec[maxn];
33
34 void dfs(int u, int fa) {
35 dp[u] = 0;
36 int size = vec[u].size();
37 for(int i = 0; i < size; i++) {
38 int v = vec[u][i].v, w = vec[u][i].w;
39 if(v == fa) continue;
40 if(w > limit) w = inf;
41 dfs(v, u);
42 dp[u] += min(dp[v], w);
43 }
44 if(!dp[u]) dp[u] = inf;
45 }
46
47 void solve() {
48 int ans = -1;
49 int l = 1, r = 1000;
50 while(l <= r) {
51 int mid = (l + r) >> 1;
52 limit = mid;
53 dfs(1, -1);
54 if(dp[1] <= m) ans = mid, r = mid - 1;
55 else l = mid + 1;
56 }
57 cout << ans << endl;
58 }
59
60 int main() {
61 while(~scanf("%d%d", &n, &m)) {
62 if(!n) break;
63 for(int i = 1; i <= n; i++) vec[i].clear();
64 for(int i = 1; i < n; i++) {
65 int u, v, w;
66 scanf("%d%d%d", &u, &v, &w);
67 vec[u].pb(Edge(v, w));
68 vec[v].pb(Edge(u, w));
69 }
70 solve();
71 }
72 return 0;
73 }
74
銆愰瑙c戯細鐩存帴浜屽垎絳旀錛岀劧鍚庡垽鏂瓟妗堢殑姝g‘鎬с?br /> 鍋囪褰撳墠浜屽垎鐨勭瓟妗堜負 t錛岄偅涔堬細
瀵逛簬ai <= t鐨勮。鏈嶏紝鏄劇劧璁╁畠浠嚜鐒墮騫插氨鍙互浜嗐?br /> 瀵逛簬ai > t鐨勮。鏈嶏紝鎴戜滑闇瑕佺煡閬撹琛f湇鏈灝戠敤澶氬皯嬈$儤騫叉満銆?br /> 璁捐琛f湇鐢ㄤ簡x1鍒嗛挓椋庡共錛岀敤浜唜2鍒嗛挓鐑樺共鏈恒?br /> 閭d箞鏈?x1 + x2 = t 鍜?ai <= x1 + x2 * k錛岃仈绔嬩袱寮忓彲寰?x2 >= (ai - t) / (k - 1)錛屽嵆鏈灝戜嬌鐢ㄦ鏁頒負[(ai - t) / (k - 1)] 鐨勬渶灝忎笂鐣屻?br /> 鏈鍚庯紝鍒ゆ柇涓涓嬫諱嬌鐢ㄦ鏁版槸鍚﹀皯浜?t 鍗沖彲銆?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 100050
19 int n;
20 ll val[maxn], ans, k;
21
22 bool check(ll t) {
23 ll cnt = 0;
24 for(int i = 0; i < n; i++) {
25 if(val[i] > t) {
26 cnt += (val[i] - t + k - 2) / (k - 1);
27 if(cnt > t) return false;
28 }
29 }
30 return true;
31 }
32
33 void solve() {
34 ll l = 1, r = ans;
35 while(l <= r) {
36 ll mid = (l + r) >> 1;
37 if(check(mid)) ans = mid, r = mid - 1;
38 else l = mid + 1;
39 }
40 printf("%lld\n", ans);
41 }
42
43 int main() {
44 while(~scanf("%d", &n)) {
45 ans = 0;
46 for(int i = 0; i < n; i++) {
47 scanf("%lld", &val[i]);
48 ans = max(ans, val[i]);
49 }
50 scanf("%lld", &k);
51 if(k == 1) printf("%lld\n", ans);
52 else solve();
53 }
54 return 0;
55 }
56
銆愰瑙c戯細鍙互鍏堝垎鏋愪竴涓嬶紝褰撹繖涓渾閿ョ殑楂樺緢澶ф椂錛屽渾閿ョ殑浣撶Н闈炲父澶э紱褰撹繖涓渾閿ョ殑楂樺お灝忕殑鏃跺欙紝鍦嗛敟鐨勫崐寰勫氨浼氶潪甯稿ぇ錛屾鏃跺渾閿ョ殑浣撶Н榪樻槸寰堝ぇ銆?br /> 浜庢槸鎴戜滑鍙互寰楀嚭涓涓粨璁猴紝鍦嗛敟鐨勯珮涓嶈兘澶皬涔熶笉鑳藉お澶с?br /> 榪欓噷鏈変竴姝ラ澶勭悊錛屽氨鏄妸絀洪棿鐩磋鍧愭爣緋昏漿鎹負鏌遍潰鍧愭爣緋匯?x,y,z) => (sqrt(x*x+y*y),z);
鏈変簡涓婇潰鐨勭粨璁猴紝鎴戜滑灝卞彲浠ュ埄鐢ㄤ笁鍒嗘瀬鍊兼潵紜畾榪欎釜楂樼殑鏈浼樺鹼紝鐒跺悗閫氳繃鐩鎬技涓夎褰㈠氨鍙互姹傚嚭鍦嗛敟鐨勫崐寰勩?br /> 姝ら涔熷彲浠ラ氳繃涓夊垎鍗婂緞鏉ユ眰瑙c?br />
銆愪唬鐮併戯細
2 #include "cstdio"
3 #include "cstring"
4 #include "cmath"
5 using namespace std;
6 #define maxn 10500
7 #define eps 1e-8
8 #define pi 3.1415926535897932384626433832795
9 int n;
10 double rr;
11 struct Point {
12 double x, y, r, z;
13 Point(){}
14 Point(double _x, double _y, double _z) {
15 x = _x, y = _y, z = _z, r = sqrt(_x * _x + _y * _y) ;
16 }
17 }point[maxn];
18
19 double work(double h) {
20 double tmp;
21 rr = 0.0;
22 for(int i = 0; i < n; i++) {
23 double r = point[i].r, z = point[i].z;
24 double tmp = h * r / (h - z);
25 rr = max(rr, tmp);
26 }
27 double area = pi * rr * rr * h / 3.0;
28 return area;
29 }
30
31 void solve(double res) {
32 double low = res, high = 10000000, mid, mmid, ansh, ansr;
33 while(low + eps < high) {
34 mid = (low + high) / 2.0;
35 mmid = (mid + high) / 2.0;
36 if(work(mid) < work(mmid)) {
37 high = mmid;
38 ansh = mid;
39 } else {
40 low = mid;
41 ansh = mmid;
42 }
43 ansr = rr;
44 }
45 printf("%.3f %.3f\n", ansh, ansr);
46
47 }
48
49 int main() {
50 int T;
51 double x, y, z;
52 scanf("%d", &T);
53 while(T--) {
54 scanf("%d", &n);
55 double low = 0.0;
56 for(int i = 0; i < n; i++) {
57 scanf("%lf%lf%lf", &x, &y, &z);
58 point[i] = Point(x, y, z);
59 low = max(low, z);
60 }
61 solve(low);
62 }
63 return 0;
64 }