略蛋疼的一道题目,研究了好久,最开始简单的枚举回溯法,果断超时。网上看到了好多人的优化,最后选择了一种线性的解法,只需扫描一遍即可。
基本思路:将问题转化为依次往板上放包裹,为了让板尽可能的平衡,一定是先放扭矩小的上去,所以先将包裹分类,左支点左边的一波,中间的一波,右支点右边的一波,分别排序,把中间的一波先放上去,这样可以增加系统的稳定性,然后左右两边依次往上放直到一边失去平衡,换另一边上,如果两边都不能放还有剩余的话,就是没有解了。
思路参考:
http://www.ngszone.com/blog/archives/250
0.019s AC:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int len; int wei; int n; typedef struct Pack { int x; int w; int torque; } Pack; Pack left[25]; Pack right[25]; Pack mid[25]; Pack all[25]; int lenL = 0, lenR = 0, lenM = 0, lenA = 0; int isBalanced(int idx) { double weiLeftA = 0; double weiRightA = 0; double weiLeftB = 0; double weiRightB = 0; weiLeftA += 0.5 * (0.5 * len - 1.5) * (0.5 * len - 1.5) * wei / len; weiRightA += 0.5 * (0.5 * len + 1.5) * (0.5 * len + 1.5) * wei / len; weiLeftB += 0.5 * (0.5 * len + 1.5) * (0.5 * len + 1.5) * wei / len; weiRightB += 0.5 * (0.5 * len - 1.5) * (0.5 * len - 1.5) * wei / len; int i; for (i = 0; i < idx; i++) { if (all[i].x < -1.5) weiLeftA += (-1.5 - all[i].x) * all[i].w; if (all[i].x > -1.5) weiRightA += (all[i].x + 1.5) * all[i].w; if (all[i].x < 1.5) weiLeftB += (1.5 - all[i].x) * all[i].w; if (all[i].x > 1.5) weiRightB += (all[i].x - 1.5) * all[i].w; } if (weiLeftA > weiRightA) return 0; if (weiLeftB < weiRightB) return 0; return 1; } int cmp(const void*a, const void*b) { Pack *aa = (Pack*) a; Pack *bb = (Pack*) b; return aa->torque - bb->torque; } int main() { int cases = 1; while (scanf("%d%d%d", &len, &wei, &n)) { if (len == 0) break; lenL = lenR = lenM = lenA = 0; int i; int tmpX, tmpW; for (i = 0; i < n; i++) { scanf("%d%d", &tmpX, &tmpW); all[lenA].x = tmpX; all[lenA].w = tmpW; lenA++; if (tmpX < -1.5) { left[lenL].x = tmpX; left[lenL].w = tmpW; left[lenL].torque = abs(tmpX * tmpW); lenL++; } else if (tmpX > 1.5) { right[lenR].x = tmpX; right[lenR].w = tmpW; right[lenR].torque = abs(tmpX * tmpW); lenR++; } else { mid[lenM].x = tmpX; mid[lenM].w = tmpW; mid[lenM].torque = abs(tmpX * tmpW); lenM++; } } printf("Case %d:\n", cases++); if (!isBalanced(lenA)) { printf("Impossible\n"); continue; } qsort(left, lenL, sizeof(Pack), cmp); qsort(mid, lenM, sizeof(Pack), cmp); qsort(right, lenR, sizeof(Pack), cmp); int l = 0, m = 0, r = 0, a = 0; int f1 = 0; int f2 = 0; int impossible = 0; while (m < lenM) { memcpy(&all[a++], &mid[m++], sizeof(Pack)); } while (a < lenA) { while (l < lenL) { memcpy(&all[a++], &left[l++], sizeof(Pack)); if (!isBalanced(a)) { a--; l--; f1 = 1; break; } else { f2 = 0; } } while (r < lenR) { memcpy(&all[a++], &right[r++], sizeof(Pack)); if (!isBalanced(a)) { a--; r--; f2 = 1; break; } else { f1 = 0; } } if (f1 && f2) { impossible = 1; break; } } if (impossible) printf("Impossible\n"); else { for (i = lenA - 1; i >= 0; i--) printf("%d %d\n", all[i].x, all[i].w); } } return 0; }
枚举回溯超时的代码:
#include<stdio.h> #include<string.h> int len; int wei; int n; int pac[25][2]; int removed[25]; int a[25]; int solved; int isBalanced() { int weiLeft = 0; int weiRight = 0; weiLeft += 0.5 * (0.5 * len - 1.5) * (0.5 * len - 1.5) * wei / len; weiRight += 0.5 * (0.5 * len + 1.5) * (0.5 * len + 1.5) * wei / len; int i; for (i = 0; i < n; i++) { if (removed[i]) continue; if (pac[i][0] < -1.5) { weiLeft += (pac[i][0] * (-1) - 1.5) * pac[i][1]; } if (pac[i][0] > -1.5) { weiRight += (pac[i][0] + 1.5) * pac[i][1]; } } if (weiLeft > weiRight) return 0; weiLeft = 0; weiRight = 0; weiLeft += 0.5 * (0.5 * len + 1.5) * (0.5 * len + 1.5) * wei / len; weiRight += 0.5 * (0.5 * len - 1.5) * (0.5 * len - 1.5) * wei / len; for (i = 0; i < n; i++) { if (removed[i]) continue; if (pac[i][0] > 1.5) { weiRight += (pac[i][0] - 1.5) * pac[i][1]; } if (pac[i][0] < 1.5) { weiLeft += (1.5 - pac[i][0]) * pac[i][1]; } } if (weiRight > weiLeft) return 0; return 1; } void removePac(int cur) { if (solved) return; if (cur == n) { solved = 1; int i; for (i = 0; i < n; i++) { printf("%d,%d\n", pac[a[i]][0], pac[a[i]][1]); } } else { int i; for (i = 0; i < n; i++) { int j; int ok = 1; for (j = 0; j < cur; j++) { if (a[j] == i) { ok = 0; break; } } if (ok) { if (!isBalanced()) return; a[cur] = i; removed[i] = 1; removePac(cur + 1); removed[i] = 0; } } } return; } int main() { int cases = 1; while (scanf("%d%d%d", &len, &wei, &n)) { if (len == 0) break; memset(removed, 0, sizeof(removed)); solved = 0; int i; for (i = 0; i < n; i++) { scanf("%d%d", &pac[i][0], &pac[i][1]); } printf("Case %d:\n", cases++); removePac(0); if (!solved) printf("Impossible\n"); } return 0; }
相关推荐
本文将深入探讨"spring-racing-tipping-backend"项目,这是一个专为"spring-racing-tipping-app"设计的后端数据库组件。项目以JavaScript为基础,展示了如何利用该语言构建高效、稳定的后端服务,以支持应用程序的...
《Tipping Point》是一本由著名作家马尔科姆·格拉德威尔(Malcolm Gladwell)撰写的畅销书,首次出版于2000年。该书主要探讨了社会变化和传播过程中存在的“引爆点”现象——即某些微小的变化或行为如何能够引发大...
样例提示应用程序 我当前的Android编程能力演示。 很基本,不太花哨。 看起来像什么: 提示页面的小费应用程序- 用于计算餐厅小费的活动页面- 技能集亮点 尽管这是一个非常基本的应用程序,但其中涉及的一些技能...
作业前-TipMe TipCalculator是iOS的小费计算器应用程序。 提交者:Sabrina Slattery 花费的时间:总共花费了4个小时,正在进行中,最近更新时间为1/15/2021用户故事完成以下必需的功能: 用户可以输入账单金额,选择...
【标题】"AFL Tipping - ECTIP 开源项目" 这个开源项目名为"AFL Tipping - ECTIP",其主要目标是提供一个基于Web的澳大利亚橄榄球联盟(AFL)比赛预测平台。用户可以在这个系统上进行比赛结果的预测,通过1-8分的...
在IT行业中,`initrc_tipping_point`似乎指的是初始化脚本(`initrc`)与系统运行级别转换的关键点,也就是所谓的“临界点”。这通常涉及到Linux或类UNIX系统的启动过程。`init`是系统启动后运行的第一个进程,它负责...
《Tipping-Table:Windows窗体应用中的小费计算实践》 在计算机编程的世界里,尤其是在桌面应用领域,C#语言以其强大的功能和简洁的语法,成为开发Windows应用程序的首选工具之一。本项目名为“Tipping-Table”,是...
4. **冲压方向调整**:DFE----TIPPING/UNDERCUT考虑冲压方向对成形的影响。 5. **内部填充**:DFE----PREPARATION----INNER FILL增强内部结构的网格密度。 6. **外部光顺**:DFE----PREPARATION---OUTER SMOOTH...
【JSP Sports Tipping 开源项目详解】 JSP(JavaServer Pages)是一种广泛使用的服务器端脚本语言,它允许开发者将HTML代码与Java代码结合在一起,以创建动态Web应用程序。"JSP Sports Tipping" 是一个开源项目,...
- **书名含义**:“引爆点”(The Tipping Point)一词在这里指的是社会现象或产品在市场上达到的一个临界点,在这一点上,小的变化能够引发巨大的效果,就像多米诺骨牌一样,一旦被触动,就能引起连锁反应。...
您可以拉出更改并运行rm composer.lock && composer install --prefer-dist --no-scripts以合并升级。 Laravel和AngularJS入门应用程序 这是一个单页应用程序入门应用程序的存储库,该应用程序具有现代Laravel PHP...
jobbio+goodstr+loli+tipping 这些文档资料的一个综合运用,非常实用 jobbio+goodstr+loli+tipping 这些文档资料的一个综合运用,非常实用
:person_tipping_hand: hamidsardar / starter-laravel-angular已升级到Laravel 5.1.0。 您可以拉出更改并运行rm composer.lock && composer install --prefer-dist --no-scripts以合并升级。 Laravel和AngularJS...
资源名:Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者...
:person_tipping_hand_light_skin_tone:维基 :man_light_skin_tone::laptop:데모영상 능:school:능능:school::school: :alarm_clock: 서비스 리이버리스트업데이트 드라이버및오더상태 새로운구독및오...
给小费Oracle服务Docker服务构建映像docker build -t oracle-service . 创建数据目录以保留密钥对/ oracle mkdir data && sudo chown 1001:1001 data 运行服务docker run -it --init -v $PWD/data/:/app/.data/ -e ...
聚会工具确保已安装virtualenvwrapper。 mkvirtualenv meetuppip ... 其内容应如下所示: SHORT_NAME = 'cow-tipping'FULL_NAME = 'Chicago Cow Tipping Meetup Group'CONTACT_EMAIL = 'chicago.cow.tipping@gmail....
基于MATLAB实现的Tipping的相关向量机RVM的回归程序,有英文注释,可以运行+使用说明文档.zip 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b...
它由英国科学家Michael Tipping在2001年提出,是支持向量机(SVM)的一个变种,但引入了贝叶斯框架,使得模型能够自动选择重要的特征并进行稀疏化。在这个基于MATLAB的实现中,我们将会深入探讨RVM的回归应用及其...
G-Bomber-141 暗黑猎人的Gmail爆炸工具141.没有登录。没有垃圾邮件箱,只有收件箱 :inbox_tray: :person_tipping_hand: pkg安装python2 git clone cd G-Bomber-141 #python2主