usaco training Barn Repair題解

Description

在一個暴風雨的夜晚,農民約翰的牛棚的屋頂、門被吹飛了. 好在許多牛正在度假,所以牛棚沒有住滿. 剩下的牛一個緊挨着另一個被排成一行來過夜. 有些牛棚裏有牛,有些沒有. 所有的牛棚有相同的寬度. 自門遺失以後,農民約翰很快在牛棚之前豎立起新的木板. 他的新木材供應者將會供應他任何他想要的長度,但是供應者只能提供有限數目的木板. 農民約翰想將他購買的木板總長度減到最少. 給出 M(1<= M<=50),可能買到的木板最大的數目;S(1<= S<=200),牛棚的總數;C(1 <= C<=S) 牛棚裏牛的數目,和牛所在的牛棚的編號stall_number(1 <= stall_number <= S),計算攔住所有有牛的牛棚所需木板的最小總長度. 輸出所需木板的最小總長度作爲的答案.

Input

第 1 行: M , S 和 C(用空格分開)
第 2 到 C+1 行: 每行包含一個整數,表示牛所佔的牛棚的編號.

Output

單獨的一行包含一個整數表示所需木板的最小總長度.

Sample Input

4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

Sample Output

25

HINT

一種最優的安排是用板攔住牛棚3-8,14-21,25-31,40-43.

這道題看起來好難,其實只需要找到n-1個空檔來不鋪板子,sort一下。

#include<stdio.h>
#include<algorithm>
using namespace std;
int d[201],f[201];
int main()
{
	int a,b,c,i;
	scanf("%d%d%d",&a,&b,&c);
	for(i=1;i<=c;i++)
		scanf("%d",&d[i]);		
	sort(d+1,d+c+1);
	for(i=1;i<=c;i++)
		f[i]=d[i]-d[i-1];			
	int ans=b;
	ans-=d[1]-1;
	ans-=b-d[c];
	for(i=1;i<c;i++)
		f[i]=f[i+1];
	sort(f+1,f+c);
	ans+=a-1;
	if(a>=c)
		printf("%d",c);
	else
	{
		a--;
		for(i=c-1;i>0;i--)
		{
			if(a==0)
				printf("%d",ans);
			ans-=f[i];
			a--;
		}		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章