《程序设计语言综合设计》第四周上机练习——3 开机方案

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,k,i,j,a[100005],b[100004],m=0;
 5 int main()
 6 {
 7     cin>>n>>k>>a[i];
 8     for(i=1;i<n;i++) {cin>>a[i];b[i]=a[i]-a[i-1];}//输入
 9     sort(b+1,b+n);//将b从小到大排序
10     for(i=1;k++<n;m+=b[i++]-1){}//每次连接时间距离最近的任务,使m增量最小
11     cout<<m+n<<endl;//输出
12 }

与第三周的练习“不诚实的卖家”思路基本一致:

1.当无能量限制时,时间m自然等于n(每个任务做完就把电脑关掉)

2.当有能量限制时,每次循环,需找到相邻的两个任务,使得连续完成它们“多花费的时间”最少

例如数据:

10 5
1 2 5 6 8 11 13 15 16 20(数组a)
先把“每组相邻任务连续完成多花费的时间”记录到数组b:b[i]=a[i]-a[i-1]-1;
得到数组b:0,2,0,1,2,1,1,0,3;
由于能量为5,任务为10,故需要把(10-5)组任务连在一起完成;
即10-5次循环,每次m+=b[i]min;
过程:m=n=10;
m+=0,0,0,1,1;
m=12;

原文地址:https://www.cnblogs.com/miaohengming/p/12499691.html