天天看点

codeforces-1110B. Tape-题解

题目:

你有一根长棍,长为m。但是,有些部分已经损坏,需要修复。你有一个无限长的修复磁带。想从胶带上剪下一些,然后用它们盖住所有的碎片。您可以覆盖不间断段;也有可能一些胶带会重叠,这些零件的最小总长度是多少?

输入

第一行包含三个整数n,m,k——破碎的片段数量,棒的长度和部分可以使用的最大数量。

第二行包含n整数b1,b2,…,bn破碎段的位置。这些整数是按递增顺序给出的,即b1<b2<…<bn

输出

打印零件的最小总长度。

input:                                                                    

4 100 2                                                                          

20 30 75 80                                                                

output:                                                                     

17      

input:   

5 100 3      

1 2 4 60 87 

output:

6                                                                 

个示例中,可以使用一段长度11来覆盖破碎的段20和30,使用另一段长度6来覆盖75和80,总长度为17。

在第二个示例中,您可以使用一个长度为4的片段来覆盖断开的片段1、2和4,使用两个长度为1的片段来覆盖断开的片段60和87,共要6。

即:

一个长为m的木棍,有n个缺口,你最多可以用k个长条补缺口,问用来补缺口的长条最短是多少(ant)。

思路:

求出将相邻两个断点之间的距离,并进行排序,然后用数组a[i]来存,再计算从第一个断点到最后一个断点之间的距离(先用ant来存),最后用ant(从最长的片段开始)减去一定数量的片段。(数量的多少由k的值决定)

my code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k,a[1000000],d[1000000],ant=0;
int main()
{
	cin>>n>>m>>k;
	for(int i=0;i<n;i++)//输入断点的位置,存入a[i] 
		cin>>a[i];
	for(int i=0;i<n;i++)
		d[i]=a[i+1]-a[i];//依次排列两断点之间的距离,存入d[i] 
	ant=a[n-1]-a[0]+1;//第一个断点与第二个断点之间的距离 
	sort(d,d+n);//将相邻断点间的距离大小排序(从小到大) 
	for(int i=n-1;i>n-k;i--)
		ant=ant-d[i]+1;
	cout<<ant<<endl;
	return 0;
}

​
           

继续阅读