华为oj 购物单
这两天断断续续敲完这个(放假的时候比较懒),一次成功有点小激动(●'◡'●) 不过貌似从第一次打开开始计时。。。。。
这道题目很像01背包,我将附件与它们的主件绑定(就是link起来)然后套用动态规划
ok,解决
#include<iostream>
#include<vector>
using namespace std; class node {//代表主件的类
public:
int value;
int p;//重要度
int n;//附件个数
int q;//附件指向的主件编号
node *link;
node():value(0),p(0),n(0),q(0),link(nullptr){}
}; int judge(vector<node*>& vc,int N,int m);
int max(int, int); int main()
{
int N, m;
vector<node*> vc;
cin >> N >> m;
for (int i = 0;i < m;i++) {
int vi, pi, qi;
cin >> vi >> pi >> qi;
node *np = new node();
np->value = vi;
np->p = pi;
np->q = qi;
vc.push_back(np);
}
for (vector<node*>::iterator i = vc.begin();i != vc.end();i++) {
int tmp = (*i)->q;
if (tmp > 0) {
if(vc[tmp-1]->link==nullptr)
vc[tmp - 1]->link = *i;
else
vc[tmp - 1]->link->link = *i;
vc[tmp - 1]->n++;
} }
for (vector<node*>::iterator i = vc.begin();i != vc.end();) {
int tmp = (*i)->q;
if (tmp > 0) {
i=vc.erase(i);
}
else {
++i;
} }
cout<<judge(vc, N, m)<<endl;
return 0;
}
int judge(vector<node*>& vc, int N, int m) {
//任务 返回经过计算的结果
//建立一个int[3200][60]数组 因为N为10的倍数
int tb[3200][60] = {0};
vector<node*>::iterator ib = vc.begin();
for (int i = 1;i <= N / 10;i++) {
if ((*ib)->n == 0) {
if ((*ib)->value <= i*10) {
tb[i][1] = ((*ib)->value*(*ib)->p);
}
}
if ((*ib)->n == 1) {
if (((*ib)->value+(*ib)->link->value) <= i*10) {
tb[i][1] = ((*ib)->value*(*ib)->p)+ ((*ib)->link->value*(*ib)->link->p);
}
else {
tb[i][1] = ((*ib)->value*(*ib)->p);
}
}
if ((*ib)->n == 2) {
if (((*ib)->value + (*ib)->link->value+ (*ib)->link->link->value) <= i*10) {
tb[i][1] = ((*ib)->value*(*ib)->p) + ((*ib)->link->value*(*ib)->link->p)+ ((*ib)->link->link->value*(*ib)->link->link->p);
}
else if (((*ib)->value + (*ib)->link->value) <= i*10) {
tb[i][1] = ((*ib)->value*(*ib)->p) + ((*ib)->link->value*(*ib)->link->p);
}
else {
tb[i][1] = ((*ib)->value*(*ib)->p);
}
}
}
++ib;//使迭代器指向下一个元素
int j=1;
for (;ib != vc.end();ib++,j++) {
for (int i = 1;i <= N / 10;i++) { if ((*ib)->n == 0) {//没有附件
int tmp1 = (*ib)->value;
int tmp1_ = (*ib)->p;
if (tmp1 > i * 10) {
tb[i][j] = tb[i][j - 1];
}
else {
tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
}
} if ((*ib)->n == 1) {//有一个附件
int tmp1 = (*ib)->value;
int tmp1_ = (*ib)->p;
int tmp2 = (*ib)->link->value;
int tmp2_ = (*ib)->link->p; if (tmp1 > i * 10) {
tb[i][j] = tb[i][j - 1];
}
else if ((tmp1 + tmp2) > i * 10) {
tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
}
else {
int m1= max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
tb[i][j] = max(m1, tb[i - (tmp1+tmp2) / 10][j - 1] + tmp1*tmp1_+tmp2*tmp2_);
}
} if ((*ib)->n == 1) {//有两个附件
int tmp1 = (*ib)->value;
int tmp1_ = (*ib)->p;
int tmp2 = (*ib)->link->value;
int tmp2_ = (*ib)->link->p;
int tmp3= (*ib)->link->link->value;
int tmp3_ = (*ib)->link->link->p;
if (tmp1 > i * 10) {
tb[i][j] = tb[i][j - 1];
}
else if ((tmp1 + tmp2) > i * 10) {
tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
}
else if((tmp1+tmp2+tmp3)>i*10){
int m1 = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
tb[i][j] = max(m1, tb[i - (tmp1 + tmp2) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_);
}
else {
int m1 = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
int m2= max(m1, tb[i - (tmp1 + tmp2) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_);
tb[i][j] = max(m2, tb[i - (tmp1 + tmp2 + tmp3) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_ + tmp3*tmp3_);
}
} }
}
return tb[N/10][j-1]; } int max(int a, int b) {
if (a > b)
return a;
else
return b;
}
华为oj 购物单的更多相关文章
- 华为OJ:火车进站
火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...
- 在华为oj的两个月
一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...
- 蓝桥杯 购物单(使用word协助)
标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...
- 2017第八届蓝桥杯C/C++ B组省赛-购物单
标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...
- 购物单:Excel的应用
题目描述: 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠 ...
- 购物单 && 动态规划 && 背包问题
题目叙述的言语倒是蛮多的: 王强今天很开心,公司发给N元的年终奖.王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 ...
- 2017蓝桥杯购物单(C++B组)
原题: 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.这不,XX大促销又来了!老板夫人开出了长长的购物单,都是 ...
- Java实现第八届蓝桥杯购物单
购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打 ...
- Java蓝桥杯01——第一题集锦:堆煤球、购物单、哪天返回、第几天、分数
堆煤球(2016JavaB) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100 ...
随机推荐
- October 29th Week 44th Saturday 2016
I am a slow walker, but I never walk backwards. 我走得慢,但我从不后退. I walked very slow, sometimes I even sl ...
- Delphi的 Format格式化函数
转载自:http://www.cnblogs.com/mumble/archive/2011/05/25/2056462.html Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮 ...
- 【Java EE 学习 71 下】【数据采集系统第三天】【分析答案实体】【删除问题】【删除页面】【删除调查】【清除调查】【打开/关闭调查】
一.分析答案实体 分析答案实体主要涉及到的还是设计上的问题,技术点几乎是没有的.首先需要确定一下答案的格式才能最终确定答案实体中需要有哪些属性. 答案格式的设计是十分重要的,现设计格式如下: 在表单中 ...
- jq 模板
菜鸟教程1.4.6版本angularJS <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js ...
- [Tool]Inno Setup创建软件安装程序。
这篇博客将介绍如何使用Inno Setup创建一个软件安装程序. Inno Setup官网:http://www.jrsoftware.org/isinfo.php. 可以下载到最新的Inno Set ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP
Fxx and game 问题描述 青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...
- Qt中 QString 和int, char等的“相互”转换
转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- 主机信息收集工具DMitry
主机信息收集工具DMitry DMitry是Kali Linux内置的一款信息收集工具.它的目标主要是Web类主机.它不仅通过主动查询.端口扫描方式,还借助第三方网站和搜索引擎获取信息. 它搜集的 ...