博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10154 - Weights and Measures
阅读量:4983 次
发布时间:2019-06-12

本文共 1492 字,大约阅读时间需要 4 分钟。

这道题隔了一个才做,动归有些生疏了,但从新捡起来发现比以前理解的更透彻了。

f[i]表示托i个乌龟时的最轻重量,不断的去更新重量使其最小。

这里要先做好预处理, 也就是为最长子序列拍好序。但是按照什么顺序排序呢?这里要用到一点贪心,我们想如果现在有两个乌龟,一个力气大一个力气小,重力我们不用管,那么应该把力气大的乌龟放在下面,还是力气小的呢,你可能会想,这和重力有关啊,仔细分析,如果力量大的在下面,力量小的在上面,那么力量大的还能承受的重力就是s[da]-w[xiao]-w[da],力量小的能够承受的重力为s[xiao],前者可能大于,等于,或小于后者;如果力量小的在下面,力量大的在上面,那么力量小的能够承受的重力就是s[xiao]-w[xiao]-w[da],力量大的能够承受的重力为s[da],前者一定小于后者,总的承重能力受制于前者。这两种方式 第二种的总的承重能力显然不及第一种,也就是第一种更优,所以力量大的在下面一定比力量轻的在下面更好。所以我们按力量排序。

因此按照力量升序开始检索,只要满足力量大于本身重力+f[i],就可以更新max及f[i+1],这里更新从大到小是因为我们更新的是f[i+1],如果从小到大,就破坏的后面的更新。

这里还要提一句,就是力量小于本身体重的,连自己都拖不动,是不会被处理的:

#include
#include
#include
#define INF 100000000#define MAXN 6000int n, w[MAXN], s[MAXN], f[MAXN], r[MAXN];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q; return s[*p] - s[*q]; }void solve(){ memset(f, 0x3f, sizeof(f)); f[0] = 0; for(int i = 1; i < n; i ++) r[i] = i; qsort(r+1, n, sizeof(r[0]), cmp); int max = 0; for(int i = 1; i < n; i ++) for(int j = max; j >= 0; j--) if(f[j] + w[r[i]] < s[r[i]] && f[j] + w[r[i]] < f[j+1]) { f[j+1] = f[j] + w[r[i]]; if(j+1 > max) max = j+1; } printf("%d\n",max);}void init(){ n = 1; while(~scanf("%d%d",&w[n],&s[n])) if(w[n] <= s[n]) n ++; solve();}int main(){ init(); //system("pause"); return 0;}

转载于:https://www.cnblogs.com/yuzhaoxin/archive/2012/07/21/2602372.html

你可能感兴趣的文章
C语言讲义——变量的输出
查看>>
shell脚本 ----每天学一点shell
查看>>
FZU2150 :Fire Game (双起点BFS)
查看>>
php_常用操作_读取文件_数据库操作
查看>>
Linux中GCC源码编译安装
查看>>
equals与==关于Object覆盖和重载问题
查看>>
KVO
查看>>
js基础教程四之无缝滚动
查看>>
关于C51 keil使用中.c文件的链接心得
查看>>
Ios 弹框 MJPopup,KxMenu
查看>>
ssh框架添加时添加不到数据库问题
查看>>
解决AR中Receivable Activities 运行不了的问题
查看>>
SQL SERVER 如何处理带字母的自增列--【叶子】
查看>>
使用DocFX生成文档
查看>>
AssemblyInfo.cs文件的作用
查看>>
android之PackageManager简单介绍
查看>>
GitLab备份与恢复
查看>>
20155307《网络对抗》免杀原理与实践
查看>>
《Android开发卷——自定义日期选择器(三)》
查看>>
游里工夫独造微一一小平邦彦传
查看>>