【HDU - 5777】domino(贪心)
題干:
Little White plays a game.There are n pieces of dominoes on the table in a row. He can choose a domino which hasn't fall down for at most k times, let it fall to the left or right. When a domino is toppled, it will knock down the erect domino. On the assumption that all of the tiles are fallen in the end, he can set the height of all dominoes, but he wants to minimize the sum of all dominoes height. The height of every domino is an integer and at least 1.
Input
The first line of input is an integer T (?1≤T≤101≤T≤10)?
There are two lines of each test case.?
The first line has two integer n and k, respectively domino number and the number of opportunities.(?2≤k,n≤1000002≤k,n≤100000)?
The second line has n - 1 integers, the distance of adjacent domino d,?1≤d≤1000001≤d≤100000
Output
For each testcase, output of a line, the smallest sum of all dominoes height
Sample Input
1 4 2 2 3 4Sample Output
9題目大意:
桌子上有n張多米諾骨牌排成一列。它有k次機會,每次可以選一個還沒有倒的骨牌,向左或者向右推倒。每個骨牌倒下的時候,若碰到了未倒下的骨牌,可以順帶把它推倒。現(xiàn)在可以隨意設(shè)置骨牌的高度,但是骨牌高度為整數(shù),且至少為1,并且 小白希望在能夠推倒所有骨牌的前提下,使所有骨牌高度的和最小。(n,k<=1e5)
轉(zhuǎn)化后的題意:
有n個炸彈排成一列。我現(xiàn)在有k次行動機會,每一次我可以選擇一座未被摧毀的位置為a的炸彈,使其自爆并摧毀(a-Xa,a]或[a,a+Xa)內(nèi)的所有炸彈,其中Xa表示它的充能值。我可以在所有行動前配置每一個炸彈的充能值,我想在配置的總充能值最小的情況下摧毀所有炸彈,請計算這個最小值。炸彈間的距離皆為整數(shù),炸彈的充能值必須為整數(shù)且至少為1。
Input
輸入第一行包含一個整數(shù)T(1≤T≤10),表示數(shù)據(jù)組數(shù)。
每一組數(shù)據(jù)第一行包含兩個整數(shù)n,k(2≤n,k≤105),含義如題所述。
接下來包含n-1個整數(shù),表示相鄰炸彈的距離di(1≤di≤105)。
Output
對于每一組數(shù)據(jù),輸出可能的最小充能總和。
解題報告:
其實推倒可以連續(xù),也就是說最后的答案肯定是最多min(n,K)個連續(xù)的區(qū)間,而且可以證明肯定不會有一個骨牌可以同時推倒多個骨牌的情況。因為那樣的話需要多花一個高度。(畫一畫就看出來了)
而且這一段區(qū)間因為是連續(xù)推倒,所以肯定是往一邊倒,也就是說往左和往右可以自己設(shè)定,都是等價的,這邊我們默認往左倒。這樣想的話,就是如何把這n-1個值分成 k 份,使得區(qū)間內(nèi)的和最小,那么就是簡單的排序,去掉前k-1大的。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; int n,k,a[MAX]; int main() {int T;cin>>T; while(T--) {cin>>n>>k;for(int i = 1; i<=n-1; i++) scanf("%d",a+i);sort(a+1,a+n);if(k>=n) {printf("%d\n",n); continue;}ll ans = 0;for(int i = 1; i<=n-k; i++) ans += a[i];ans += n;printf("%lld\n",ans);}return 0 ; }?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的【HDU - 5777】domino(贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今年世界十大经济体GDP排名,仅五个排名
- 下一篇: 为什么比特币比黄金还值钱?十枚比特币和1