4—1会场安排问题
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int k;
cin >> k;//输入k个待安排的活动
int begin[1000]; //记录活动的开始时间
int end[1000]; //记录活动的结束时间
for (int i = 0; i < k; i++)//输入k个待安排活动的开始时间和结束时间
{
cin >> begin[i] >> end[i];
}
sort(begin, begin + k); //最早开始时间
sort(end, end + k); //最早结束时间
int count = 0, j = 0;
for (int i = 0; i < k; i++)
{
if (begin[i] > end[j])
j++;
else
num++;
}
cout << num;
return 0;
}
sort函数
头文件:#include<algorithm>
用法:sort(start,end,排序方法)
第三个参数可以不写,排序方法默认升序。
//1. bool compare(int a,int b) { return a>b; } sort(a,a+10,compare)//实现降序排序 //2. struct node//定义结构体 { int a; int b; double c; } //先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。 bool cmp(node x,node y) { if(x.a!=y.a) return x.a<y.a; if(x.b!=y.b) return x.b>y.b; return x.c>y.c; }
活动安排 问题
//把各个活动的起始时间和结束时间按结束时间非减序排序
void sort(int n,int f[])
{
int tempa,i,j;
for(i=1; i<=n; i++)
{
for(j=i+1; j<=n; j++)
{
if(f[i]>f[j])
{
tempa=f[i];
f[i]=f[j];
f[j]=tempa;
}
}
}
}
//贪心算法
int GreedySelect(int n,int s[],int f[],bool A[])
{
A[1]=true;//将第一个活动先安排
int i;
int j=1;//j为刚刚被选中的活动的编号
int count=1; //count为被安排的节目个数
for(i=2; i<=n; i++)
{
if(s[i]>=f[j])
{
A[i]=1;
j=i;
count++;
}
else A[i]=0;
}
return count;
}
4-2最优合并问题
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a, int b)
{
return a > b;
}
//最少比较次数
int min(int* a, int n)
{
int min = 0;
for (int m = 0; m < n - 1; m++) {
sort(a + m, a + n);
a[m + 1] = a[m] + a[m + 1];
min = min + a[m + 1] - 1;
}
return min;
}
//最多比较次数
int max(int* b, int n)
{
int max = 0;
for (int m = 0; m < n - 1; m++) {
sort(b + m, b + n, cmp);
b[m + 1] = b[m] + b[m + 1];
max = max + b[m + 1] - 1;
}
return max;
}
int main()
{
int i, n;
cin >> n;
int a[1000], b[1000];
for (i = 0; i < n; i++) {
cin >> a[i];
b[i] = a[i];
}
cout << max(b, n) << " " << min(a, n) << endl;
return 0;
}
4-3最优服务次序问题
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 100
using namespace std;
int main()
{
int n, A[N];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> A[i];
}
sort(A, A + n);
int sum = A[0];
for (int i = 1; i < n; i++)
{
A[i] += A[i - 1];
sum += A[i];
}
printf("%f", sum * 1.0 / n);
return 0;
}
多处最优服务次序问题
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define N 10000
int main()
{
int i, j;
int min;
int index;//当前等待时间最小的工位
int n;
int s;//服务点数量
double sum;
int a[N];//每个顾客的服务时间
int wait[N];//每个站点的等待服务时间
while (cin >> n >> s)
{
for (i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
memset(wait, 0, sizeof(wait));
for (i = 0; i < n; i++)
{
min = wait[0];
index = 0;
sum = 0;
for (j = 0; j < s; j++) //选择当前等待时间最小的工位
{
if (min > wait[j])
{
min = wait[j];
index = j;
}
}
wait[index] += a[i];
a[i] = wait[index];
}
for (i = 0; i < n; i++) {
sum = sum + a[i];
}
sum /= n;
printf("%d\n", (int)(sum));
}
return 0;
}
4-4最优分解问题
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, re = 0, sum, count = 2;
vector<int>arr(100);
arr[0] = 2;
cin >> n;
re = n - 2;
int i = 1;
while (i) {
count = count + arr[i - 1] + 1;//下一个数比上一个数多1
if (count <= n) {//所有数累加和不得大于原有数n
arr[i] = arr[i - 1] + 1;//存入符合要求的数
re = re - arr[i];//更新剩余数
}
else
break;
i++;
}
int num = i;//保存数组元素个数
for (int j = re; j > 0; j--) {//从数组尾部向首部平均分配剩余数
arr[i - 1] = arr[i - 1] + 1;
i--;
re--;
if (i == 0 && re != 0) {//数组中的每一个元素都分一遍后还有剩余数,则取剩余数继续以上步骤
j = re + 1;//+1的原因是循环后面会j--,为了保证剩余数不变,故加1
i = num;
}
}
sum = arr[0];
for (int k = 1; k < num; k++) {//累乘
sum = sum * arr[k];
}
cout << sum << endl;
return 0;
}
4-5多元Huffman编码问题
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int> > mypq2;
priority_queue<int> mypq1;
int n, k;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++) {
int flog;
scanf("%d", &flog);
mypq1.push(flog);
mypq2.push(flog);
}
//最大花费
int sum1 = 0, num1 = 0;
while (mypq1.size() != 1)
{
for (int i = 0; i < 2; i++) {
num1 += mypq1.top();
mypq1.pop();
}
sum1 += num1;
mypq1.push(num1);
num1 = 0;
}
printf("%d ", sum1);
//最小花费
int sum2 = 0, num2 = 0;
if ((n - 1) % (k - 1)) {
for (int i = 0; i < (n - 1) % (k - 1) + 1; i++) {
num2 += mypq2.top();
mypq2.pop();
}
sum2 += num2;
mypq2.push(num2);
num2 = 0;
}
while (mypq2.size() != 1)
{
for (int i = 0; i < k; i++) {
num2 += mypq2.top();
mypq2.pop();
}
sum2 += num2;
mypq2.push(num2);
num2 = 0;
}
printf("%d", sum2);
return 0;
}