NEFU瑞格算法设计与分析第四章贪心算法实验三

实验三题号

6122

这个题思路很容易,就是一直走,走到路程和大于等于7时停止,回到上个加油站加油,加油次数+1,并将这个加油站记录到数组c中即可,将路程和置为这段路最后走的两个加油站之间的距离,直到走完就行。题目中说要求输出具体在哪几个加油站加油,但是最终给的输出实例只输出了加油次数,并没有输出在哪几个加油站加油,不过我还是加上了这段代码。
在这里插入图片描述
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;
	cin>>n>>k;
	int d[k+1],c[k+1],num=0,ans=0;
	for(int i=1;i<=k+1;i++)
	{
		cin>>d[i];
		c[i]=0;   //先将从数组c全部元素初始化为0 
	}	
	for(int i=1;i<=k+1;i++)
	{
		num+=d[i];  //一直走,走过一段路加上这段路的距离 
		if(num>=7)  //当行驶了的路程大于或者等于7时 
		{
			ans++;  //加油次数+1 
			num=d[i]; //置为这段路程最后走的两个加油站之间的距离 
			c[i]=1;   //1表示在第i个加油站加油 
		}
	}
	for(int i=1;i<=k+1;i++)
	{
		if(c[i]==1)   //1表示在第i个加油站加油,输出加油站的序号 
		  cout<<i<<" ";
	}
	cout<<endl<<ans<<endl;
	return 0;
}

6121

这个题的思路就跟老师上课讲的活动安排是一样的,具体思路参考老师上课讲的吧。
在这里插入图片描述
代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
	cin>>n;
	int s[101],f[101];
	for(int i=1;i<=n;i++)
	{
		cin>>s[i]>>f[i];
		if(s[i]>f[i])          //输入的左端点大于右端点,交换值 
		   swap(s[i],f[i]);
	}
    for (int i = 1; i <=n - 1; i++)   //选择排序,按照右端点从小到大排序 
	{
    	for (int j = i + 1; j <=n; j++)
		{
			if (f[i] > f[j]) 
			{
				swap(s[i], s[j]);
				swap(f[i], f[j]);
			}
		}
	}
	int ans=0;
    int curTime=0;
	for(int i=1;i<=n;i++)
	{
		if(curTime<s[i])  //找到区间左端点比上一个计数的区间右端点大的区间 
		{
			ans++;
            curTime=f[i];  //将当前找到的区间的右端点赋给curTime 
		}
	}
	cout<<ans<<endl;
    return 0;
 }

6120

这个题思路也比较容易,跟自己原来做过一个打水排队问题差不多,思路就是让服务时间少的顾客先被服务,这样总的等待时间是最少的。
在这里插入图片描述
代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
	cin>>n;
	int a[n],sum=0,num=0;
	for(int i=0;i<n;i++)
	  cin>>a[i];
	sort(a,a+n);  //先快速排序 
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<=i;j++)
      	    num+=a[j];  //计算每个顾客等待的时间 
		sum+=num;    //计算总的等待时间 
		num=0;
    }
	printf("%.2lf",sum/(double)n);
 } 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值