#include <stdio.h>
#include <stdlib.h>
// Struct để lưu trữ cặp giá trị a_i và b_i
typedef struct {
char a;
double b;
} Pair;
// Hàm so sánh để sử dụng trong qsort
int compare(const void *a, const void *b) {
const Pair *pairA = (const Pair *)a;
const Pair *pairB = (const Pair *)b;
return (pairA->b - pairB->b);
}
// Hàm in ra trace
void printTrace(Pair *pairs, int size) {
for (int i = 0; i < size; i++) {
}
}
// Hàm thực hiện B1: sắp xếp dãy b_i và tương ứng sắp xếp dãy a_i
void stepB1(Pair *pairs, int size) {
qsort(pairs
, size
, sizeof(Pair
), compare
); }
// Hàm thực hiện B2: lặp cho đến khi chỉ còn một phần tử trong dãy b_i
void stepB2(Pair *pairs, int size) {
while (size > 1) {
// Chọn hai phần tử có giá trị nhỏ nhất
double min1 = pairs[0].b;
double min2 = pairs[1].b;
int idx1 = 0;
int idx2 = 1;
for (int i = 2; i < size; i++) {
if (pairs[i].b < min1) {
min2 = min1;
idx2 = idx1;
min1 = pairs[i].b;
idx1 = i;
} else if (pairs[i].b < min2) {
min2 = pairs[i].b;
idx2 = i;
}
}
// Ghép hai phần tử chọn được thành một phần tử mới
double sum = min1 + min2;
char newA = pairs[idx1].a < pairs[idx2].a ? pairs[idx1].a : pairs[idx2].a;
// Xóa hai phần tử đã ghép và thêm phần tử mới vào dãy
pairs[idx1] = pairs[idx2] = pairs[size - 1];
pairs[size - 2].a = newA;
pairs[size - 2].b = sum;
// Giảm kích thước của dãy đi hai phần tử đã ghép
size--;
// Sắp xếp lại dãy b_i để tiếp tục lặp
qsort(pairs
, size
, sizeof(Pair
), compare
);
// In ra trace sau mỗi bước lặp
printTrace(pairs, size);
}
}
int main() {
int testCases;
while (testCases--) {
int M;
// Tạo mảng lưu trữ các cặp giá trị a_i và b_i
Pair
*pairs
= (Pair
*)malloc(M
* sizeof(Pair
));
// Nhập dữ liệu cho mảng
for (int i = 0; i < M; i++) {
scanf(" %c", &pairs
[i
].
a); scanf("%lf", &pairs
[i
].
b); }
// Thực hiện bước B1
stepB1(pairs, M);
// In ra trace trước khi thực hiện bước B2
printTrace(pairs, M);
// Thực hiện bước B2
stepB2(pairs, M);
// Giải phóng bộ nhớ đã cấp phát cho mảng
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIFN0cnVjdCDEkeG7gyBsxrB1IHRy4buvIGPhurdwIGdpw6EgdHLhu4sgYV9pIHbDoCBiX2kKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBhOwogICAgZG91YmxlIGI7Cn0gUGFpcjsKCi8vIEjDoG0gc28gc8OhbmggxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgcXNvcnQKaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgewogICAgY29uc3QgUGFpciAqcGFpckEgPSAoY29uc3QgUGFpciAqKWE7CiAgICBjb25zdCBQYWlyICpwYWlyQiA9IChjb25zdCBQYWlyICopYjsKICAgIHJldHVybiAocGFpckEtPmIgLSBwYWlyQi0+Yik7Cn0KCi8vIEjDoG0gaW4gcmEgdHJhY2UKdm9pZCBwcmludFRyYWNlKFBhaXIgKnBhaXJzLCBpbnQgc2l6ZSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBwcmludGYoIiVjICIsIHBhaXJzW2ldLmEpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9CgovLyBIw6BtIHRo4buxYyBoaeG7h24gQjE6IHPhuq9wIHjhur9wIGTDo3kgYl9pIHbDoCB0xrDGoW5nIOG7qW5nIHPhuq9wIHjhur9wIGTDo3kgYV9pCnZvaWQgc3RlcEIxKFBhaXIgKnBhaXJzLCBpbnQgc2l6ZSkgewogICAgcXNvcnQocGFpcnMsIHNpemUsIHNpemVvZihQYWlyKSwgY29tcGFyZSk7Cn0KCi8vIEjDoG0gdGjhu7FjIGhp4buHbiBCMjogbOG6t3AgY2hvIMSR4bq/biBraGkgY2jhu4kgY8OybiBt4buZdCBwaOG6p24gdOG7rSB0cm9uZyBkw6N5IGJfaQp2b2lkIHN0ZXBCMihQYWlyICpwYWlycywgaW50IHNpemUpIHsKICAgIHdoaWxlIChzaXplID4gMSkgewogICAgICAgIC8vIENo4buNbiBoYWkgcGjhuqduIHThu60gY8OzIGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0CiAgICAgICAgZG91YmxlIG1pbjEgPSBwYWlyc1swXS5iOwogICAgICAgIGRvdWJsZSBtaW4yID0gcGFpcnNbMV0uYjsKICAgICAgICBpbnQgaWR4MSA9IDA7CiAgICAgICAgaW50IGlkeDIgPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYWlyc1tpXS5iIDwgbWluMSkgewogICAgICAgICAgICAgICAgbWluMiA9IG1pbjE7CiAgICAgICAgICAgICAgICBpZHgyID0gaWR4MTsKICAgICAgICAgICAgICAgIG1pbjEgPSBwYWlyc1tpXS5iOwogICAgICAgICAgICAgICAgaWR4MSA9IGk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFpcnNbaV0uYiA8IG1pbjIpIHsKICAgICAgICAgICAgICAgIG1pbjIgPSBwYWlyc1tpXS5iOwogICAgICAgICAgICAgICAgaWR4MiA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEdow6lwIGhhaSBwaOG6p24gdOG7rSBjaOG7jW4gxJHGsOG7o2MgdGjDoG5oIG3hu5l0IHBo4bqnbiB04butIG3hu5tpCiAgICAgICAgZG91YmxlIHN1bSA9IG1pbjEgKyBtaW4yOwogICAgICAgIGNoYXIgbmV3QSA9IHBhaXJzW2lkeDFdLmEgPCBwYWlyc1tpZHgyXS5hID8gcGFpcnNbaWR4MV0uYSA6IHBhaXJzW2lkeDJdLmE7CgogICAgICAgIC8vIFjDs2EgaGFpIHBo4bqnbiB04butIMSRw6MgZ2jDqXAgdsOgIHRow6ptIHBo4bqnbiB04butIG3hu5tpIHbDoG8gZMOjeQogICAgICAgIHBhaXJzW2lkeDFdID0gcGFpcnNbaWR4Ml0gPSBwYWlyc1tzaXplIC0gMV07CiAgICAgICAgcGFpcnNbc2l6ZSAtIDJdLmEgPSBuZXdBOwogICAgICAgIHBhaXJzW3NpemUgLSAyXS5iID0gc3VtOwoKICAgICAgICAvLyBHaeG6o20ga8OtY2ggdGjGsOG7m2MgY+G7p2EgZMOjeSDEkWkgaGFpIHBo4bqnbiB04butIMSRw6MgZ2jDqXAKICAgICAgICBzaXplLS07CgogICAgICAgIC8vIFPhuq9wIHjhur9wIGzhuqFpIGTDo3kgYl9pIMSR4buDIHRp4bq/cCB04bulYyBs4bq3cAogICAgICAgIHFzb3J0KHBhaXJzLCBzaXplLCBzaXplb2YoUGFpciksIGNvbXBhcmUpOwoKICAgICAgICAvLyBJbiByYSB0cmFjZSBzYXUgbeG7l2kgYsaw4bubYyBs4bq3cAogICAgICAgIHByaW50VHJhY2UocGFpcnMsIHNpemUpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCB0ZXN0Q2FzZXM7CiAgICBzY2FuZigiJWQiLCAmdGVzdENhc2VzKTsKCiAgICB3aGlsZSAodGVzdENhc2VzLS0pIHsKICAgICAgICBpbnQgTTsKICAgICAgICBzY2FuZigiJWQiLCAmTSk7CgogICAgICAgIC8vIFThuqFvIG3huqNuZyBsxrB1IHRy4buvIGPDoWMgY+G6t3AgZ2nDoSB0cuG7iyBhX2kgdsOgIGJfaQogICAgICAgIFBhaXIgKnBhaXJzID0gKFBhaXIgKiltYWxsb2MoTSAqIHNpemVvZihQYWlyKSk7CgogICAgICAgIC8vIE5o4bqtcCBk4buvIGxp4buHdSBjaG8gbeG6o25nCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKICAgICAgICAgICAgc2NhbmYoIiAlYyIsICZwYWlyc1tpXS5hKTsKICAgICAgICAgICAgc2NhbmYoIiVsZiIsICZwYWlyc1tpXS5iKTsKICAgICAgICB9CgogICAgICAgIC8vIFRo4buxYyBoaeG7h24gYsaw4bubYyBCMQogICAgICAgIHN0ZXBCMShwYWlycywgTSk7CgogICAgICAgIC8vIEluIHJhIHRyYWNlIHRyxrDhu5tjIGtoaSB0aOG7sWMgaGnhu4duIGLGsOG7m2MgQjIKICAgICAgICBwcmludFRyYWNlKHBhaXJzLCBNKTsKCiAgICAgICAgLy8gVGjhu7FjIGhp4buHbiBixrDhu5tjIEIyCiAgICAgICAgc3RlcEIyKHBhaXJzLCBNKTsKCiAgICAgICAgLy8gR2nhuqNpIHBow7NuZyBi4buZIG5o4bubIMSRw6MgY+G6pXAgcGjDoXQgY2hvIG3huqNuZwogICAgICAgIGZyZWUocGFpcnMpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==