华为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 ...
随机推荐
- 怎么写makefile?(转)
跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...
- 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
之前说过,如果一个数据库中要存储的数据量整体比较小,但是其中一个表存储的数据比较多,比如日志表,这时候就要考虑分表存储了:但是如果一个数据库整体存储的容量就比较大,该怎么办呢?这时候就需要考虑分库了, ...
- IntelliJ Idea 常用快捷键 列表
1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 例如要输入for(U ...
- Oracle sql连接
inner-join left-outer-join right-outer-join full- ...
- 私有无线传感网 PWSN HLINK
私有无线传感网,我把其叫做 Personal Wireless Sensor Network.此种网络最另众人所知的就是ZIGBEE了.由于在用户不同的使用场景中,对传感网络有许多不同的要求,例如:通 ...
- Nginx - Windows下作为服务启动
Nginx官方没有提供作为服务启动nginx的方案.以服务启动nginx依赖于winsw,当前最新版是1.19. 参考:https://segmentfault.com/a/1190000006807 ...
- <HTML>菜鸟入门基础须知
将持续更新-- 一,基础常用标签and属性 既然要学习这门知识,那必须得先知道这是什么能做什么,HTML:是一种超文本标记语言,什么意思呢,我拆开看一下,超(超链接)文本(犹如TXT)标记(改变成自己 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- 2016 Multi-University Training Contests
2016 Multi-University Training Contest 1 2016 Multi-University Training Contest 2 2016 Multi-Univers ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...