zoukankan      html  css  js  c++  java
  • HDU 5777 domino (排序,水题)

    题意:小白在玩一个游戏。桌子上有n张多米诺骨牌排成一列。它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒。每个骨 牌倒下的时候,若碰到了未倒下的

    骨牌,可以把它推倒。小白现在可以随意设置骨牌的高度,但是骨牌高度为整数,且至少为1,并且 小白希望在能够推倒所有骨牌的前提下,使所有骨牌高度的和最小。

    析:首先骨牌只要考虑都往右推,其次能带倒骨牌的前提是高度大于等于距离+1。所以如果推一次,那么就是骨牌高度=离下一块骨牌距离+1. 把第一块左边距离设为无穷大,能

    推nk次,那么就是找nk块左边距离最大的向右推倒即可,所以只需要排序找到前nk-1大的距离。 有个小trick,推的次数可能大于骨牌数量 复杂度 O(nlogn)。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <set>
    #include <cstring>
    #include <queue>
    using namespace std;
    
    typedef long long LL;
    
    int kase, n, k, a[100007];
    
    int main(){
        int T;
        scanf("%d", &T);
        while(T--) {
            scanf("%d%d", &n, &k);
            LL ans = n;
            for(int i = 0; i < n-1; ++i) {
                scanf("%d", &a[i]);
            }
    
            sort(a, a+n-1);
            for(int i = 0; i < n-k; ++i)
                ans += a[i];
            printf("%I64d
    ", ans);
        }
    }
    
  • 相关阅读:
    02-自定义CALayer
    01-CALayer的基本操作
    抽屉效果
    手势识别
    事件响应
    寻找最合适的view
    hitTest方法与PointInside方法
    02-事件的产生与传递
    OC图标+启动图
    OC多线程操作
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5723430.html
Copyright © 2011-2022 走看看