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;
    }
    
  • 相关阅读:
    Core的学习三:容器的使用实例
    Core的学习二:【四步完成】.Net Core中Log4net的使用,配置,【框架.NET5】
    C#7 的一些新语法
    C#6 的一些新语法
    Core的学习一:Core部署在IIS下
    C# 特性【Attribute】【什么是特性?以及特性的一些修饰】
    C#反射
    泛型 -Generic 【why,原理,与普通方法,object的性能对比如何?泛型类、泛型方法、泛型接口、泛型委托,泛型约束,协变 逆变,泛型缓存】
    springboot通过切面编程实现系统请求操作日志记录
    Linux 【安装配置VM虚拟机】
  • 原文地址:https://www.cnblogs.com/pfypfy/p/9164005.html
Copyright © 2011-2022 走看看