会场安排
//会场
#include <stdio.h>
#include <stdlib.h>
void quicksort(int arr[], int low, int high);
int partition(int arr[], int low, int high);
void swap(int *a, int *b);
int main() {
int n;
scanf("%d", &n);
// //为数组动态分配内存。
int *start = (int *)malloc(n * sizeof(int));
int *end = (int *)malloc(n * sizeof(int));
if (start == NULL || end == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%d %d", &start[i], &end[i]);
}
//快速排序
quicksort(start, 0, n - 1);
quicksort(end, 0, n - 1);
int sum = 0;
int j = 0;
for (int i = 0; i < n; i++) {
if (start[i] < end[j]) {
sum++; //如果开始时间小于结束时间,请打开一个新会场。
} else {
j++; // 移动到下一个结束时间。
}
}
printf("%d\n", sum);
free(start);
free(end);
return 0;
}
void quicksort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quicksort(arr, low, pi - 1);
quicksort(arr, pi + 1, high);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
最优合并
//最优合并
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
// 升序
int cmp1(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
// 降序
int cmp2(const void* a, const void* b) {
return (*(int*)b - *(int*)a);
}
// 最优情况
int getMin(int* a, int n) {
int min = 0;
for (int i = 0; i < n - 1; i++) {
qsort(a + i, n - i, sizeof(int), cmp1); // 升序
a[i + 1] += a[i]; // 更改数据
min += a[i + 1] - 1;
}
return min;
}
// 最差情况
int getMax(int* b, int n) {
int max = 0;
for (int i = 0; i < n - 1; i++) {
qsort(b + i, n - i, sizeof(int), cmp2); // 降序
b[i + 1] += b[i];
max += b[i + 1] - 1;
}
return max;
}
int main() {
int *a = NULL, *b = NULL;
int n, input;
// 读取用户输入的数据个数
printf("请输入数据个数:");
scanf("%d", &n);
// 动态分配内存
a = (int*)malloc(n * sizeof(int));
b = (int*)malloc(n * sizeof(int));
if (a == NULL || b == NULL) {
printf("内存分配失败。\n");
free(a);
free(b);
return 1;
}
// 读取用户输入的数据
printf("请输入要合并的序列:");
for (int i = 0; i < n; i++) {
scanf("%d", &input);
a[i] = input;
b[i] = input;
}
printf("\n");
// 输出数据
int min = getMin(a, n);
int max = getMax(b, n);
// 输出结果
printf("最差情况max=%d,最优情况min=%d\n", max, min);
// 释放内存
free(a);
free(b);
return 0;
}
汽车加油
//汽车加油
#include <stdio.h>
#include <stdlib.h>
void greedy(int d[], int n, int k) {
int num = 0;
// 检查是否有加油站之间的距离大于汽车加满油能跑的距离
for (int i = 0; i <= k; i++) {
if (d[i] > n) {
printf("no solution! 其中有一个距离大于汽车加满油能跑的距离!\n");
return;
}
}
// 计算最少加油次数
int s = 0; // 当前累计距离
for (int i = 0; i <= k; i++) {
s += d[i];
if (s > n) {
num++;
s = d[i]; // 重置累计距离为当前加油站的距离
}
}
printf("最少加油次数为:%d\n", num);
}
int main() {
int n, k;
int d[1000];
printf("请输入汽车加满油后可行驶的距离: ");
scanf("%d", &n);
getchar(); // 清除缓冲区中的换行符
printf("请输入旅途中加油站个数: ");
scanf("%d", &k);
getchar(); // 清除缓冲区中的换行符
printf("请输入各个加油站之间的距离(用空格分隔): ");
for (int i = 0; i <= k; i++) {
scanf("%d", &d[i]);
}
greedy(d, n, k);
return 0;
}
最优服务次序问题
//最优服务次序问题
#include <stdio.h>
#include <stdlib.h>
// 比较函数,供qsort使用
int compare(const void *a, const void *b) {
int arg1 = *(const int*)a;
int arg2 = *(const int*)b;
if (arg1 < arg2) return -1;
if (arg1 > arg2) return 1;
return 0;
}
double fun1(int *list, int n) {
int i;
int sum = 0;
for (i = 0; i < n; i++) {
sum += list[i] * (n - i);
}
return ((double)sum) / (n * 1.0);
}
int main() {
int i, n;
scanf("%d", &n);
int *list = (int *)malloc(n * sizeof(int)); // 动态分配内存
if (list == NULL) {
printf("Memory allocation failed.\n");
return 1; // 内存分配失败,退出程序
}
for (i = 0; i < n; i++) {
scanf("%d", &list[i]);
}
// 使用qsort函数对数组进行排序
qsort(list, n, sizeof(int), compare);
double result = fun1(list, n);
printf("%.2f\n", result); // 格式化输出,保留两位小数
free(list); // 释放内存
return 0;
}
汽车加油
//汽车加油
#include <stdio.h>
#include <stdlib.h>
void greedy(int d[], int n, int k) {
int num = 0;
// 检查是否有加油站之间的距离大于汽车加满油能跑的距离
for (int i = 0; i <= k; i++) {
if (d[i] > n) {
printf("no solution! 其中有一个距离大于汽车加满油能跑的距离!\n");
return;
}
}
// 计算最少加油次数
int s = 0; // 当前累计距离
for (int i = 0; i <= k; i++) {
s += d[i];
if (s > n) {
num++;
s = d[i]; // 重置累计距离为当前加油站的距离
}
}
printf("最少加油次数为:%d\n", num);
}
int main() {
int n, k;
int d[1000];
printf("请输入汽车加满油后可行驶的距离: ");
scanf("%d", &n);
getchar(); // 清除缓冲区中的换行符
printf("请输入旅途中加油站个数: ");
scanf("%d", &k);
getchar(); // 清除缓冲区中的换行符
printf("请输入各个加油站之间的距离(用空格分隔): ");
for (int i = 0; i <= k; i++) {
scanf("%d", &d[i]);
}
greedy(d, n, k);
return 0;
}
最优分解
#include<stdio.h>
#include<stdlib.h>
int OptimalDecomposition (int n)
{
//int before_n = n;
//如果要分解的数小于等于4,那么最终乘积为n-1
if (n <= 4)
{
return n - 1;
}
//如果大于4
//从2开始分解
int i = 0;
int k = 2;
int a[10000] = { 0 };
while (n>k)
{
a[i++] = k;
n -= k;
k++;
}
//如果最后剩下的数字等于最后一个数字
if (n == a[i - 1])
{
n--;
a[i - 1]++;
}
//对前面的数字从后向前+1
for (int j = 0; j < n; j++)
{
a[i - 1 - j]++;
}
//求乘积
int maxProduct = 1;
for (int j = 0; j < i ; j++)
{
maxProduct *= a[j];
}
return maxProduct;
}
int main ()
{
int n = 0;
scanf ( "%d",&n);
int maxProduct = OptimalDecomposition ( n );
printf ("%d",maxProduct );
return 0;
}