华为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 ...
随机推荐
- java写RelativeLayout 的属性
有时项目需要动态的调整一下布局,需要改变一些view的位置属性等等. 直接下代码 RelativeLayout.LayoutParams params=new RelativeLayout.Layou ...
- js如何求一组数中的极值
这是一个很简单的问题,现在我们从循环开始,例如一组数[5,2,1,3,4];求其中的最大值,那么首先我们要定义一个max的中间变量,遍历数组,当遇到比max值大则赋值给max,直到循环结束,就能获取这 ...
- C# Cookie
1 推荐使用 is 或 as 操作符而不是强制 2 编码风格:Tab ——改成两个 C# 文档注释的快捷键 (将配置表压缩,从压缩文件中查找xml配置表 这个是指Unity项目上面) 尽量使 ...
- Scrapy 爬虫 使用指南 完全教程
scrapy note command 全局命令: startproject :在 project_name 文件夹下创建一个名为 project_name 的Scrapy项目. scrapy sta ...
- 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...
- 使用base.调用父类里面的属性
使用base.调用父类里面的属性public class parent { public string a; }public class child :parent { public string g ...
- activemq 控制面板里的 Number Of Pending Messages、 Messages Enqueued、Messages Dequeued含义
Number Of Consumers 消费者 这个是消费者端的消费者数量 Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队 ...
- MIT 6.828 JOS学习笔记10. Lab 1 Part 3: The kernel
Lab 1 Part 3: The kernel 现在我们将开始具体讨论一下JOS内核了.就像boot loader一样,内核开始的时候也是一些汇编语句,用于设置一些东西,来保证C语言的程序能够正确的 ...
- tcp三次握手、四次挥手
TCP的三次握手(建立连接)和四次挥手(关闭连接):http://blog.csdn.net/whuslei/article/details/6667471/ TCP协议中的三次握手和四次挥手(图解) ...
- shell命令大全
请跳转至:http://www.lampweb.org/linux/2/3.html