zoukankan      html  css  js  c++  java
  • 20180610模拟赛T3——书本整理

    【问题描述】

    小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱。小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和。

    例如有4本书:

    1×2
    5×3
    2×4
    3×1

    那么小明将其排列整齐后的顺序是:

    1×2
    2×4
    3×1
    5×3

    凌乱值就是2+3+2=7

    于是小明决定拿掉其中的k本书,使凌乱值最小,你能帮他求出这个最小值吗?已知每本书的高度都不一样。

    【问题输入】

    第一行两个数字n和k,代表书总共有n本,要求从中去掉k本。((lle n le 100, 1le k le n))。下面的n行,每行两个数字表示一本书的高度和宽度,它们均小于200。

    【问题输出】

    一行一个整数,表示书架的最小凌乱值。

    【样例输入】

    4 1
    1 2
    2 4
    3 1
    5 3

    【样例输出】

    3

    【数据范围】

    30%的数据,n≤20。

    100%的数据,n≤l00,k<n。

    题解

    JYT:这是一道简单的动态规划题……

    记录去掉(k)本比较麻烦,那就记录留下(n-k)本吧……

    (dp[i][j])表示到第(i)本且必须保留(i),保留了(j)本的方案数。

    容易得到转移方程:

    (dp[i][kk+1] = min(dp[i][kk+1], dp[j][kk] + abs(book[i].kuan - book[j].kuan)))

    book[i].kuan表示第(i)本书的宽度。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    using namespace std;
    
    #define fill(a) memset(a, 0x3f, sizeof(a))
    
    const int maxn = 105;
    
    int dp[maxn][maxn];
    
    struct BOOK
    {
    	int quan, h, kuan;
    
    	inline bool operator < (const BOOK& other) const
    	{
    		return h < other.h;
    	}
    } book[maxn];
    
    const int inf = 0x3f3f3f3f;
    
    int main()
    {
    	freopen("book.in", "r", stdin);
    	freopen("book.out", "w", stdout);
    	int n, k;
    	scanf("%d%d", &n, &k);
    	for(int i = 1; i <= n; ++i)
    		scanf("%d%d", &book[i].h, &book[i].kuan);
    	k = n-k;
    	sort(book+1, book+1+n);
    	fill(dp);
    	for(int i = 1; i <= n; ++i)
    		dp[i][1] = 0;
    	for(int i = 2; i <= n; ++i)
    		for(int j = 1; j < i; ++j)
    			for(int kk = 1; kk < k; ++kk)
    				dp[i][kk+1] = min(dp[i][kk+1], dp[j][kk] + abs(book[i].kuan - book[j].kuan));
    	int ans = inf;
    	for(int i = 1; i <= n; ++i)
    		ans = min(ans, dp[i][k]);
    	printf("%d", ans);
    	return 0;
    }
    
  • 相关阅读:
    6-4.粗体标签
    [Unity3D] 如何实现点击按钮退出游戏
    [Unity3D] 载入游戏地图时背景图片随机切换 & 数字百分比进度条
    [Unity3D] 鼠标点击图片移动效果
    [3DMAX]如何将骨骼与模型绑定在一起(蒙皮) & 如何实现自动化人物模型蒙皮
    [Unity 3D]用鼠标滚轮实现镜头放大和缩放,并添加距离限制
    [Unity3D] 如何实现围绕旋转
    [Unity3D] 如何实现注视旋转
    Css 图片自适应
    Scss 定义内层class的简单写法
  • 原文地址:https://www.cnblogs.com/pfypfy/p/9164005.html
Copyright © 2011-2022 走看看