实验四 贪心算法
- 格式:doc
- 大小:79.50 KB
- 文档页数:7
实验四 贪心算法
一、 实验目的
进一步理解贪心算法的基本思想,学会根据具体问题设计贪心选择策略,会使用贪心算法解决一些实际问题。
二、 实验要求
1、上机前的准备工作
根据实验内容中所给题目,利用所学贪心算法的基本设计思想设计算法并编写好上机程序,以提高上机效率;
2、独立上机,输入、调试所编程序;
3、上机结束后,写出实验报告。
4、上机时间:2学时
三、 实验内容
1、4-1 会场安排问题
#include
using namespace std;
const int MAX=100;
struct sport
{
int start;//开始时间
int end;//结束时间
};
int m[MAX];
void sort(struct sport t[],int n)// 由小到大排序
{
int i,j;
for(i=1;i
for(j=1;j
if(t[j].start>t[j+1].start)
{
struct sport temp;
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
void main()
{
int max=1,count=1,n;
cout<<"请输入活动的个数:";
cin>>n;
sport t[MAX];
for(int k=1;k<=n;k++)
{ cout<<"请输入第"<
cin>>t[k].start;
cin>>t[k].end;
}
m[0]=t[1].end;
sort(t,n);
for(int i=2;i<=n;i++)
{
int j=0;
while(j
{
j++;
}
m[j]=t[i].end;
count=j+1;
if(count>max)
max=count;
}
cout<<"活动场所共需个数:"<
}
运行结果:
2、4-2 最优合并问题
#include
using namespace std;
const int MAX=100;
void sort(int r[],int n)
{
int j;
for(int i=2;i<=n;i++)
{
r[0]=r[i];
j=i-1;
while(r[0]
{
r[j+1]=r[j]; j=j-1;
}
r[j+1]=r[0];
}
}
int max(int r[],int n)
{
int sum=0;
for(int i=n;i>1;i--)
{
sum+=r[i]+r[i-1]-1;
r[i-1]=r[i]+r[i-1];
}
return sum;
}
int min(int r[],int n)
{
int sum=0;
for(int i=1;i
{
sum+=r[i]+r[i+1]-1;
r[i+1]=r[i]+r[i+1];
}
return sum;
}
void main()
{
int n,a[MAX],b[MAX];
cout<<"请输入序列的个数:";
cin>>n;
cout<<"请输入各个序列的长度:"<
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a,n);
for(int j=1;j<=n;j++)
b[j]=a[j];
cout<<"最多比较次数:"<
cout<<"最少比较次数:"<
}
运行结果:
3、数列极差问题
在黑板上写了N个正整数组成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+3,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的记作max,最小的记作min,则该数列的极差定义为M=max-min。
另一种思路:
1)先排序
2)求最小:利用两个最大数(正)相乘得到最大数
3)求最大:两个最小数相乘结果插入到已排序好的数列中。
编程实现之。
#include
using namespace std;
const int MAX=100;
void sort(int r[],int n)//将数列由小到大排序
{
int j;
for (int i=2; i<=n; i++)
{
r[0]=r[i]; j=i-1;
while (r[0]
{
r[j+1]=r[j];
j=j-1;
}
r[j+1]=r[0];
}
}
int min(int a[],int n)//求最小值
{
int m;
for(int i=n;i>1;i--)
{
m=a[i]*a[i-1]+3;
a[i-1]=m;
}
return m;
} int max(int a[],int n)//求最大值
{
int j,m;
for(int i=1;i
{
m=a[i]*a[i+1]+3;
j=i+2;
while(a[j]
{
a[j-1]=a[j];
j++;
}
a[j-1]=m;
}
return m;
}
void main()
{
int a[MAX],b[MAX];
cout<<"请输入数列包含正整数的个数:";
int n;
cin>>n;
cout<<"请依次输入数列元素:";
for(int count=1;count<=n;count++)
{
cin>>a[count];
}
sort(a,n);
for(int i=1;i<=n;i++)
b[i]=a[i];
int maxi=max(b,n);
int mini=min(a,n);
cout<<"最小值:"<
cout<<"最大值:"<
cout<<"数列的极差为:"<
}
运行结果:
4、4-6
#include
#include
using namespace std;
const int MAX=100;
struct customer
{
int time;//等待时间
int no;//顾客的服务次序号
};
void sort(struct customer t[],int n)
{
int i,j;
for(i=1;i
for(j=1;j
if(t[j].time>t[j+1].time)
{
struct customer temp;
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
float serve(struct customer t[],int n)
{
int k=n;
float sum=0;
for(int i=1;i<=n;i++)
{
sum+=t[i].time*k;
k--;
}
return sum/n;
}
void main()
{ int n;
customer t[MAX];
cout<<"请输入顾客的数量:";
cin>>n;
cout<<"请依次输入顾客的等待时间:"<
for(int i=1;i<=n;i++)
{
cin>>t[i].time;
t[i].no=i;
}
sort(t,n);
cout<
cout<<"顾客平均等待时间:"<
cout<<"顾客的服务次序为:"<
for(int k=1;k<=n;k++)
cout<
cout<
cout<
}
运行结果: