hdu 5777 贪心
来源:互联网 发布:淘宝小号刷钻软件 编辑:程序博客网 时间:2024/05/29 04:46
题目:
小白在玩一个游戏。桌子上有n张多米诺骨牌排成一列。它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒。每个骨牌倒下的时候,若碰到了未倒下的骨牌,可以把它推倒。小白现在可以随意设置骨牌的高度,但是骨牌高度为整数,且至少为1,并且小白希望在能够推倒所有骨牌的前提下,使所有骨牌高度的和最小。
输入描述
第一行输入一个整数T(1≤T≤101\leq T \leq 101≤T≤10)每组数据有两行第一行有两个整数n和k,分别表示骨牌张数和机会次数。(2≤k,n≤1000002\leq k,n\leq 1000002≤k,n≤100000)第二行有n-1个整数,分别表示相邻骨牌的距离d,1≤d≤1000001\leq d \leq 1000001≤d≤100000
输出描述
对于每组数据,输出一行,最小的高度和
输入样例
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
- hdu 5777 贪心
- hdu 5777 domino【贪心】
- HDU 5777 domino 贪心
- Hdu 5777多米诺[贪心]
- HDU 5777 贪心
- hdu 5777 domino(贪心)
- hdu 5777 domino (贪心)
- HDU 5777 (domino 贪心)
- HDU 5777 domino(贪心)
- 【HDU】5777 - domino(贪心)
- HDU 贪心
- 【贪心】hdu
- HDU 2111 Saving HDU(贪心)
- HDU 2111贪心--【Saving HDU】
- HDU 2111 Saving HDU (贪心)
- HDU Saving HDU (贪心)
- HDU 2111 Saving HDU【贪心】
- 【HDU 2111】Saving HDU(贪心)
- 后缀数组小结
- HTML、CSS、Javascript的注释
- tjut 5777
- 7.31_day2
- java转型和加载
- hdu 5777 贪心
- 怎么用干发帽有用吗
- 【7013】编程求一个后缀表达式的值
- 判断是否为素数
- linux--nginx安装-使用教程
- 广大盆友们,gjh又要出山写书了!!!
- java设计模式_组合模式
- 算法的简单概况
- BigDecimal除法后保留两位小数