USACO 1.3 Barn Repair

题目链接:http://ace.delos.com/usacoprob2?a=h9vkjno3LrX&S=barn1

如果只能使用一块木板,那就要从第一个有奶牛的stall到最后一个有奶牛的stall.
因为这一块长木板中间,可能会有空的stall,所以会浪费了木板.
如果可以使用两块木板,我们就可以在这块长木板中间挖一个洞,这样木板总长度就减小了这个洞的长度.
很明显,要木板总长度最小,就挖掉最大的那个洞.
能购买m块木板,也就是说可以挖m-1个洞.将洞的长度从大到小排序,挖掉最大的m-1个洞即可.

#include <iostream>
#include 
<fstream>
#include 
<vector>

using namespace std;

ifstream fin(
"barn1.in");
ofstream fout(
"barn1.out");

#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif

void solve()
{
    
int m,s,c;

    
in>>m>>s>>c;

    
//v保存有牛的stall
    vector<int> v(c);

    
for(int i=0;i<c;++i)
        
in>>v[i];

    sort(v.begin(),v.end());

    
// space保存所有的洞
    vector<int> space;

    
for(int i=1;i<c;++i){
        
if(v[i]-v[i-1]-1!=0){
            space.push_back(v[i]
-v[i-1]-1);
        }
    }

    sort(space.begin(),space.end(),greater
<int>());

     
//由于v的大小>=1。v==1的时候仍然成立
    int total_len = v[v.size()-1]-v[0]+1;
    
    m
-=1;

    
for(int i=0;i<space.size();++i){
        
if(m>0){
            total_len 
-=space[i];
            m
--;
        }
    }

    
out<<total_len<<endl;
}

int main(int argc,char *argv[])
{
  solve();
  
return 0;
}


posted on 2009-06-06 11:48 YZY 阅读(1170) 评论(3)  编辑 收藏 引用 所属分类: AlgorithmUSACO

评论

# re: USACO 1.3 Barn Repair 2009-07-26 11:22 ouyangyuanling

这个题目为什么不能直接将每个空白的间隙从小到大排序,然后取m个最小的长度再加上连接不是空白的牛棚数啊???  回复  更多评论   

# re: USACO 1.3 Barn Repair[未登录] 2009-07-26 20:08 YZY

这样不能保证最多用m块板子吧  回复  更多评论   

# re: USACO 1.3 Barn Repair 2009-07-26 22:18 ouyangyuanling

没有啊,好想也可以的吧,就是太麻烦了。要判断的东西变多了。照大多数人这样的思路是变的简单了问题  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜