所有题目都只是有代码和注解,证明没有,因为贪心的证明我这个蒟蒻也不会
(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
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;
}