一、问题一及代码
1.1
问题描述: 一辆虚拟汽车在加满油之后可以行驶 n km。旅途中有 k 个加油站。设计一个有效算法,使得沿途加油的次数最少。终端输入正整数 n 和 k,表示汽车加满油后可行驶 n km,且旅途中有 k 个加油站。接下来输入 k+1个整数,表示第 k 个加油站与第 k-1个加油站之间的距离。第 0 个加油站表示出发地,汽车已加满油。第 k+1个加油站表示目的地。
1.2
代码:
const int N = 20;
int main()
{
int n, k;
cin >> n>>k;
int b[N];
for (int i = 0; i <= n; i++)
{
cin >> b[i];
}
int sum = a[0];int ct = 0;
for (int j = 0; j <= k; j++)
{
if ((sum + b[j]) <= n)
{
sum += b[j];
}
else if (b[j] > n)
{
cout << "错误" << endl; return 0;
}
else
{
sum = a[j];
ct++;
}
}
cout<<ct;
return 0;
}
二、问题二及代码
2.1
问题描述: 设x1,x2,…,xn是实直线上的n 个点。用固定长度的闭区间覆盖这n 个点,至少需要多少个这样的固定长度闭区间?对于给定的实直线上的n个点和闭区间的长度k,设计解此问题的有效算法,计算覆盖点集的最少区间数。
2.2
代码:
#include<iostream>
using namespace std;
const int N=1e5+7;
int b[N];
void quick_sort(int a[],int l,int r)
{
if(l>=r)
return;
int x=a[(l+r)/2],i=l-1,j=r+1;
while(i<j)
{
while(a[i]<=x);
i++;
i++;
while(a[j]>x);
j--;
j--;
if(i<j) {
swap(a[i],a[j]);
}
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main()
{
int n,k;int tp,ct;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>b[i];
}
quick_sort(b,0,n-1);
tp=b[0],ct=1;
for(int i=0;i<n;i++)
{
if((b[i]-tp)>k)
{
tp=b[i];
ct++;
}
}
cout<<ct;
return 0;
}
三、问题三及代码
3.1
问题描述:在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max-min。
3.2
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int i,int j)
{
return i>j;
}
int main()
{
int n,mx,mn,a[50],b[50];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
a[i+1]=a[i+1]*a[i]+1;
sort(a+i,a+n);
}
mx=a[i-1];
sort(b,b+n,cmp);
for(int i=0;i<n-1;i++)
b[i+1]=b[i+1]*b[i]+1;
mn=b[n-1];
cout<<mx-mn<<endl;
return 0;
}