7-3 开机方案

h学长有个机器用来完成任务。现在有n个任务,第i个任务(1<= i <= n)在ti时刻开始,并在ti + 1时刻结束。同一时刻不会有多个任务。 h学长可以在任何时刻开启机器,不过每一次开启机器都会消耗1点能量。h学长只有k点能量可以用于开启机器。但是机器开着的时候需要消耗燃料,显然让机器一直开着并不一定是最好的选择。现在h学长想利用自己具备的k点能量,有效的控制机器的开启,使得机器完成n个任务消耗的燃料尽可能的少。那么对应给出的n个任务以及h学长拥有的能量数,你能帮帮他吗? 提示:消耗的燃料要尽可能的少,即机器工作的时间尽可能的短。
输入格式:

第一行包括两个整数 n和k(1<= n <= 1e5, 1<= k <=n) ,表示有 n个任务和h学长拥有k点能量。

接下来 n行,每行一个整数ti(1<= ti <=1e9),表示第 i 个任务在ti 时刻开始,并在ti + 1时刻结束 。
输出格式:

输出一行包含一个整数,表示机器工作的最少时间。
输入样例1:

3 2
1
3
6

输出样例1:

4

样例1说明:

h学长有2点能量,可以用于两次机器的开启。 h学长会在时刻1 即第一个任务开始时开启机器,并在第二个任务结束时关闭机器; h学长会在时刻6 即第三个任务开始时开启机器,并在第三个任务结束时关闭机器。 机器总工作时间为 (4-1)+(7-6)=4 。
输入样例2:

10 5
1
2
5
6
8
11
13
15
16
20

输出样例2:

12

样例2说明: h学长有5点能量,可以用于5次机器的开启。 h学长会在时刻1 即第1个任务开始时开启机器,并在第2个任务结束时刻3关闭机器; h学长会在时刻5 即第3个任务开始时开启机器,并在第4个任务结束时刻7关闭机器; h学长会在时刻8 即第5个任务开始时开启机器,并在第5个任务结束时刻9关闭机器; h学长会在时刻11 即第6个任务开始时开启机器,并在第9个任务结束时刻17关闭机器; h学长会在时刻20 即第10个任务开始时开启机器,并在第10个任务结束时刻21关闭机器; 机器总工作时间为 (3-1)+(7-5)+(9-8)+(17-11)+(21-20)=12 。 开机、关机时刻不唯一。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int num,start,x;
};
bool cmp(node a,node b){
	if(a.x!=b.x)	return a.x>b.x;
	return a.start<b.start;
}
int main(){
	int n,k;cin>>n>>k;
	int a[n];
	node t[n];
	cin>>t[0].start;
	t[0].x=0;
	t[0].num=0;
	a[0]=t[0].start;
	for(int i=1;i<n;i++){
		cin>>t[i].start;
		t[i].num=i;
		t[i].x=t[i].start-t[i-1].start;
		a[i]=t[i].start;
	}
	sort(t,t+n,cmp);//差时大的放前面 
	int sum=0;
	int cnt[k];
	cnt[0]=0;
	for(int i=1;i<k;i++){
		cnt[i]=t[i-1].num;
	}
	sort(cnt,cnt+k);
	for(int i=1;i<k;i++){
		sum+=(a[cnt[i]-1]-a[cnt[i-1]]+1);
	}
	sum+=(a[n-1]-a[cnt[k-1]]+1);
	cout<<sum;
	return 0;
}
发布了23 篇原创文章 · 获赞 8 · 访问量 1356

猜你喜欢

转载自blog.csdn.net/qq_45550552/article/details/104884091
7-3