贪心实验报告

所有题目都只是有代码和注解,证明没有,因为贪心的证明我这个蒟蒻也不会
(1)假设有一个需要使用某一资源的 n 个活动所组成的集合 S,S={1,…,n}。该资源任何
时刻只能被一个活动所占用,活动 i 有一个开始时间 bi 和结束时间 ei(bi<ei),其执行时间
为 ei-bi,假设最早活动执行时间为 0。
一旦某个活动开始执行,中间不能被打断,直到其执行完毕。若活动 i 和活动 j 有 bi≥ej
或 bj≥ei,则称这两个活动兼容。
设计算法求一种最优活动安排方案,使得所有安排的活动个数最多。
数据:现有 11 个活动的开始和结束时间如下表。
输入格式:
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 15
#include<bits/stdc++.h>
using namespace std;
struct act
{
	int st,end;
}active[10010];    //存储活动的开始与结束时间
bool cmp(act a,act b)
{
	return a.end<b.end;   //保证排序以结束时间升序排序
}
int main()
{
	int n;
	cin>>n;  //输入活动数目
	for(int i=0;i<n;i++)
	{
		cin>>active[i].st>>active[i].end;  //输入每个活动的起止时间
	}
	sort(active,active+n,cmp); //排序
	int cnt=1;
	int k=0;
	for(int i=0;i<n;i++)
	{
		cout<<active[i].st<<" "<<active[i].end<<endl;
	}
	for(int i=1;i<n;i++)
	{
		if(active[k].end<=active[i].st) //如果下一个活动的开始时间小于当前指向活动的结束时间,就可以让活动举行
		{
			cnt++;
			k=i;   //维护当前活动的结束日期
		}
	}
	cout<<cnt;
	return 0;
}
(2)给定共有 n 位的正整数 d,去掉其中任意 k<=n 个数字后,剩下的数字按原次序排列
组成一个新的正整数,请设计一个高效的算法,使剩余的数最小。
数据:d=492356,k=3
预期结果:235
#include<bits/stdc++.h>
using namespace std;
int main()
{
	char s[100];
	cin>>s;
	int n;
	cin>>n;
	while(n)
	{
		for(int i=0;i<strlen(s);i++)
		{
			if(s[i]>s[i+1])  //高位数比低位数大,删除
			{
			    for(int j=i;j<strlen(s);j++)
			    {
				   s[j]=s[j+1];
			    }
				n--;
			    break;
			}
		}
		
	} 
	for(int i=0;i<strlen(s)-n;i++)
	{
		cout<<s[i];
	}
	return 0;
}
(3)已知一辆汽车加满油后可行驶 d,从 A 城到 B 城的旅途中有若干个加油站,编写一个
实验程序指出应该在哪些加油站停靠加油,使加油次数最少。汽车初始满油。
数据:设 A 城坐标为 0,B 城坐标为 n,其他加油站的坐标为与起始位置之间的距离,均小
于 n,数据保证汽车能到达终点 B 城。如:d=3,n=10,加油站坐标:{2,7,3,8,9,4},
预期结果:需加油 4 次。
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);  //最大行驶距离 加油站个数
    int i,j;
    int a[n+1];
    for(i=0;i<=n;i++)   //存入起点的位置
    {
        scanf("%d",&a[i]);
    }
    int sum=a[0];//从第一站记起
    int count=0;
    for(i=0;i<=n;i++)
    {
        if((sum+a[i])<=m) //汽车可以行驶到i处
        {
            sum+=a[i];
        }
        else if(a[i]>m)//超出最大形式距离,无法完成,直接结束
        {
            printf("No Solution!");
            return 0;
        }
        else
        {
            count++;
            sum=a[i];//更新距离
        }
    }
    printf("%d\n",count);
    return 0;
}
(4)所有商品和箱子的高度都相同,商品规格 1*1、2*2,3*3,4*4,5*5,6*6,所有的商
品都要用 6*6 的箱子来装,已知各种商品的个数,问,最少需要多少个箱子。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int key[4]={0,5,3,1};
int main()
{
    ll box[6];
    while(1)
    {
        int sum=0;
        for(int i=1;i<=6;i++)
        {
            scanf("%lld", &box[i]);
            sum += box[i];
        }
        if(sum == 0)
            break;
        ll answer = box[6] + box[5] + box[4] + (box[3] + 3)/4;
        ll num2 =box[4]*5 + key[box[3] % 4];
        if(box[2] > num2)
            answer += (box[2] - num2 + 8) / 9;
        ll num1=36*answer-36*box[6]-25*box[5]-16*box[4]-9*box[3]-4*box[2];
        if(box[1] > num1)
            answer += (box[1] - num1 + 35) / 36;
        printf("%lld\n",answer);
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值