《程序设计语言综合设计》第四周上机练习——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;