P2979 [USACO10JAN]奶酪塔Cheese Towers

题意翻译

题目描述

FJ要建一个奶酪塔,高度最大为T。他有N种奶酪。第i种奶酪的高度为Hi(一定是5的倍数),价值为Vi。一块高度Hi>=K的奶酪被称为大奶酪,一个奶酪如果在它上方有大奶酪(如果有多块就只算一次),它的高度Hi就会变成原来的4/5.。FJ想让他的奶酪塔价值和最大。请你求出这个最大值。

输入格式:

第一行三个数N,T,K,意义如上所述。 接下来n行,每行两个数V_i,h_i(注意顺序)

输出格式:

奶酪塔的最大价值

题目描述

Farmer John wants to save some blocks of his cows‘ delicious Wisconsin cheese varieties in his cellar for the coming winter. He has room for one tower of cheese in his cellar, and that tower‘s height can be at most T (1 <= T <= 1,000). The cows have provided him with a virtually unlimited number of blocks of each kind of N (1 <= N <= 100) different types of cheese (conveniently numbered 1..N). He‘d like to store (subject to the constraints of height) the most

valuable set of blocks he possibly can. The cows will sell the rest to support the orphan calves association.

Each block of the i-th type of cheese has some value V_i (1 <= V_i <= 1,000,000) and some height H_i (5 <= H_i <= T), which is always a multiple of 5.

Cheese compresses. A block of cheese that has height greater than or equal to K (1 <= K <= T) is considered ‘large‘ and will crush any and all of the cheese blocks (even other large ones) located below it in the tower. A crushed block of cheese doesn‘t lose any value, but its height reduces to just 4/5 of its old height. Because the height of a block of cheese is always a multiple of 5, the height of a crushed block of cheese will always be an integer. A block of cheese is either crushed or not crushed; having multiple large blocks above it does not crush it more. Only tall blocks of cheese crush other blocks; aggregate height of a tower does not affect whether a block is crushed or not.

What is the total value of the best cheese tower FJ can construct?

Consider, for example, a cheese tower whose maximum height can be 53 to be build from three types of cheese blocks. Large blocks are those that are greater than or equal to 25. Below is a chart of the values and heights of the various cheese blocks he stacks:

Type Value Height

1 100 25

2 20 5

3 40 10

FJ constructs the following tower:

Type Height Value

top -> [1] 25 100

[2]    4     20   <- crushed by [1] above
[3]    8     40   <- crushed by [1] above
[3]    8     40   <- crushed by [1] above
bottom -> [3]    8     40   <- crushed by [1] above 

The topmost cheese block is so large that the blocks below it are crushed. The total height is:

25 + 4 + 8 + 8 + 8 = 53 The total height does not exceed 53 and thus is ‘legal‘. The total value is: 100 + 20 + 40 + 40 + 40 = 240. This is the best tower for this particular set of cheese blocks. 要建一个奶酪塔,高度最大为T。他有N块奶酪。第i块高度为Hi(一定是5的倍数),价值为Vi。一块高度>=K的奶酪被称为大奶酪,一个奶酪如果在它上方有大奶酪(多块只算一次),它的高度就会变成原来的4/5.。 很显然John想让他的奶酪他价值和最大。求这个最大值。

输入格式:

  • Line 1: Three space-separated integers: N, T, and K
  • Lines 2..N+1: Line i+1 contains two space separated integers: V_i and H_i

输出格式:

  • Line 1: The value of the best tower FJ can build

输入样例:

3 53 25

100 25

20 5

40 10

输出样例:

240

思路:

如果没有大奶酪,这道题就是一道裸的完全背包。

稍微思考能够发现,最有解只有两种情况:要么整个奶酪塔上都没有大奶酪,要么奶酪塔的最上面一块是大奶酪。因为如果在奶酪塔的中间位置有一个大奶酪,那么显然把这块大奶酪提到奶酪塔的最顶端不会使答案变劣。

对于第一种情况,直接做完全背包即可。

对于第二种情况,我们可以枚举最上面的那块大奶酪i,用v[i]+f[(T-h[i])*5/4]更新ans。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1010;

int n,t,k,ans;
int f[2*N],v[N],h[N];

int main () {
    scanf("%d%d%d",&n,&t,&k);
    for (int i=1; i<=n; i++) {
        scanf("%d%d",&v[i],&h[i]);
        for(int j=h[i]; j<=t*5/4; j++)
            f[j]=max(f[j],f[j-h[i]]+v[i]);
    }
    ans=f[t];
    for(int i=1; i<=n; i++)
        if (h[i]>=k)
            ans=max(ans,f[(t-h[i])*5/4]+v[i]);
    printf("%d\n",ans);
    return 0;
}

最后两种情况取max即可。

代码:

原文地址:https://www.cnblogs.com/mysh/p/11291363.html

时间: 2024-10-01 07:17:27

P2979 [USACO10JAN]奶酪塔Cheese Towers的相关文章

洛谷 P2979 [USACO10JAN]奶酪塔Cheese Towers

P2979 [USACO10JAN]奶酪塔Cheese Towers 题目描述 Farmer John wants to save some blocks of his cows' delicious Wisconsin cheese varieties in his cellar for the coming winter. He has room for one tower of cheese in his cellar, and that tower's height can be at

BZOJ2021: [Usaco2010 Jan]Cheese Towers

2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 184  Solved: 107[Submit][Status] Description Farmer John wants to save some blocks of his cows' delicious Wisconsin cheese varieties in his cellar for the coming winter.

BZOJ 2021 Usaco2010 Jan Cheese Towers 动态规划

题目大意:完全背包,如果最顶端的物品重量≥k,那么下面的所有物品的重量变为原来的45 考虑一些物品装进背包,显然我要把所有重量大于≥k的物品中重量最小的那个放在最顶端,才能保证总重量最小 那么我们给物品排个序,第一键值为重量是否≥k(≥k的放在前面),第二键值为重量(从小到大) 然后依次加入背包,令fi表示没有重量≥k的物品放在最顶端时重量为i的最大价值,gi表示有重量≥k的物品放在最顶端是重量为i的最大价值,DP即可 时间复杂度O(nT) #include <cstdio> #include

小结:动态规划

概要: 状态.转移:最优子结构.无后效性. 技巧及注意: dp就是纯经验+智商题 在dp方程写出来后,一定要考虑边界!不要以为转移对了就行了! 滚动数组的话一定要考虑好顺序! 下标有时候可以灵活使用!比如mod意义下的dp,倍数什么.可到达性等题目都可以这样做. 如果是线性序列的max{f[k]},k<i这种可以用线段树或bit维护成log 注意“前i”和“第i”的区别(特别对于答案更新),有时换一种就能解答出问题. 在状态加限制条件,如单调.地址等. 用下标来维护下标这个答案是否可达. 博弈论

[2016-03-28][HDU][1078][FatMouse and Cheese]

时间:2016-03-28 17:40:34 星期一 题目编号:[2016-03-28][HDU][1078][FatMouse and Cheese] #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 10; int a[maxn][maxn]; int dp[maxn][maxn]; int n ,k; int d

记忆化搜索,FatMouse and Cheese

1.从gird[0][0]出发,每次的方向搜索一下,每次步数搜索一下 for(i=0; i<4; i++) { for(j=1; j<=k; j++) { int tx=x+d[i][0]*j; int ty=y+d[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&grid[x][y]<grid[tx][ty]) { int temp=memSearch(tx,ty); i

HDU1078 FatMouse and Cheese 【内存搜索】

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4966    Accepted Submission(s): 2035 Problem Description FatMouse has stored some cheese in a city. The city can be considere

UVA1001 Say Cheese

如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径.剩下的就是完全图求单源最短路径,用不加堆优化的dijkstra就行了O(n^2). #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 102; int x[maxn],y[maxn],z[maxn],r[maxn]; d

hdu 1078 FatMouse and Cheese

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5701    Accepted Submission(s): 2320 Problem Description FatMouse has stored some cheese in a city. The city can be considered as a square grid of