2.14学习总结
#include <stdio.h>
#include <stdlib.h>
#include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素
int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid = left + (right - left) / 2;if (arr[mid] < target) {left = mid + 1;}else {right = mid;}}return left;
}// 计算最小波动值
int calculateMinFluctuation(int currentTurnover, int* previousTurnovers, int days) {if (days == 0) {return currentTurnover;}// 二分查找插入位置int pos = binarySearch(previousTurnovers, 0, days, currentTurnover);int minFluctuation;if (pos == 0) {minFluctuation = abs(currentTurnover - previousTurnovers[0]);}else if (pos == days) {minFluctuation = abs(currentTurnover - previousTurnovers[days - 1]);}else {int leftDiff = abs(currentTurnover - previousTurnovers[pos - 1]);int rightDiff = abs(currentTurnover - previousTurnovers[pos]);minFluctuation = (leftDiff < rightDiff) ? leftDiff : rightDiff;}return minFluctuation;
}// 插入元素并保持数组有序
void insertSorted(int* arr, int days, int value) {int i = days - 1;while (i >= 0 && arr[i] > value) {arr[i + 1] = arr[i];i--;}arr[i + 1] = value;
}int main() {int n;int turnovers[MAX_N];int totalFluctuation = 0;// 读取天数scanf("%d", &n);for (int i = 0; i < n; i++) {int currentTurnover;// 读取当天营业额scanf("%d", ¤tTurnover);// 计算当天最小波动值int minFluctuation = calculateMinFluctuation(currentTurnover, turnovers, i);// 累加最小波动值totalFluctuation += minFluctuation;// 插入当前营业额并保持数组有序insertSorted(turnovers, i, currentTurnover);}// 输出总的最小波动值printf("%d\n", totalFluctuation);return 0;
}
#include <stdio.h>
#include <math.h>#define MAX_N 128 // 2^7 = 128// 存储每个国家的能力值和编号
typedef struct {int ability;int id;
} Country;// 模拟一轮比赛,返回获胜国家
Country playMatch(Country a, Country b) {return a.ability > b.ability ? a : b;
}int main() {int n;scanf("%d", &n);int numCountries = (int)pow(2, n); // 计算参赛国家数量Country countries[MAX_N];// 读取每个国家的能力值for (int i = 0; i < numCountries; i++) {scanf("%d", &countries[i].ability);countries[i].id = i + 1;}// 模拟淘汰赛过程while (numCountries > 2) {for (int i = 0; i < numCountries / 2; i++) {countries[i] = playMatch(countries[2 * i], countries[2 * i + 1]);}numCountries /= 2;}// 决赛,找出冠军和亚军Country champion = playMatch(countries[0], countries[1]);Country runnerUp = (champion.id == countries[0].id) ? countries[1] : countries[0];// 输出亚军的编号printf("%d", runnerUp.id);return 0;
}