Barn Repair-usaco

题目要求用最小长度的木板来保护羊,羊放在羊圈里面,每个羊圈有一个标号,因为木板的个数是限定的,所以我们的目标便是补填空处,假设有4个空处,这样子就把羊圈分成了5段,假设只有2个木板,这样就需要合并3个空格,因此类似贪心的思想,我们从最小空处的地方开始合并,这样子得到的结果便是最优的!!

/*************************************************************************
  ID:panzhiz1
  PROG:barn1
  LANG:C++
  Created Time: 2014/4/28 15:44:44
 ************************************************************************/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<fstream>
#include<algorithm>
#include<numeric>
using namespace std;

int arr[202];
vector<int> blank;
int main(){


 int M,S,C;
 freopen("barn1.in","r",stdin);
 freopen("barn1.out","w",stdout);

 cin>>M>>S>>C;
 //int sum=0;
 for(int i=0;i<C;i++){
	 cin>>arr[i];
 }
 sort(arr,arr+C); 
 for(int i=0;i<C-1;i++)
 {
	 if(arr[i+1]-arr[i]>1){
		 blank.push_back(arr[i+1]-arr[i]-1);
	 }
 }
 sort(blank.begin(),blank.end());
 //que ding yao he bin duo shao ge kongge
 int sum=0;
 //if(M>blank.size()+1)
 if(blank.size()+1-M>0){
	 int hebin=blank.size()+1-M;
	// sum=accumulate(blank.begin(),blank.begin()+hebin,0);  /* 这样子就是错误的,显示越界为啥? blank.begin()+hebin最大的情况是blank.end(),但是这里因为end()这个值并非实际存在*/
	for(int i=0;i<hebin;i++)
		sum+=blank[i];
 }

 int i,j;
 cout<<C+sum<<endl;

// system("pause");
 return 0;
}

注:根据以往的经验,掌握的深度更加重要,也有利于往广度发展,清晰地思路,选择合适的数据结构,并考虑时空效率,而且要注重代码风格,易读,易扩展,安全。无论何时,代码只是思想的产物,从代码当中可以看书思维是否清晰,逻辑是否严谨等等等。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值