hdu 5777 贪心

来源:互联网 发布:淘宝小号刷钻软件 编辑:程序博客网 时间:2024/05/29 04:46

题目:

小白在玩一个游戏。桌子上有n张多米诺骨牌排成一列。它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒。每个骨牌倒下的时候,若碰到了未倒下的骨牌,可以把它推倒。小白现在可以随意设置骨牌的高度,但是骨牌高度为整数,且至少为1,并且小白希望在能够推倒所有骨牌的前提下,使所有骨牌高度的和最小。
输入描述
第一行输入一个整数T(1≤T≤101\leq T \leq 101T10)每组数据有两行第一行有两个整数n和k,分别表示骨牌张数和机会次数。(2≤k,n≤1000002\leq  k,n\leq  1000002k,n100000)第二行有n-1个整数,分别表示相邻骨牌的距离d,1≤d≤1000001\leq d \leq 1000001d100000
输出描述
对于每组数据,输出一行,最小的高度和
输入样例
14 22 3 4
输出样例
9


分析:遵从基本的贪心原理,使得骨牌尽量不往距离大的方向倒,由于一个距离有旁边2个骨牌,所以必然有接。


易错:题意没有说明k<=n,所以容易数组越界(orz);


代码:

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <cstdlib>#include <string>#include <queue>#include <map>#include <vector>using namespace std;const int N=100005;const int mod=1e9+7;int num[N];int main(){    int t,k,n,flag;    scanf("%d",&t);    while(t--)    {        long long sum=0;        memset(num,0,sizeof(num));        scanf("%d %d",&n,&k);        for(int i=1;i<n;i++)        {            scanf("%d",&num[i]);            sum+=num[i];        }        sort(num+1,num+n);        for(int i=1;i<k&&i<n;i++)        {            sum-=num[n-i];        }        sum+=n;        cout<<sum<<endl;    }    return 0;}


1 0