华为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 ...
随机推荐
- 建表and新增删除数据A
SELECT*FROM 表名:查询表 新建数据库: select 文件名(可以很多被查询的文件名)from 文件名 创建student表 CREATE TABLE `student` ( `id` ...
- ubantu php7.0版本降级到php5.6
http://askubuntu.com/questions/756879/cant-install-php5-on-ubuntu-16-04
- iOS自动检测版本更新
虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的. 首先说一下原理: 每个上架的苹果应用程序,都会有一个应用程序的 ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
- 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)
相机标定 一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标 ...
- Maven 命令
win7环境下,Maven跳过测试编译项目的命令: 首先,在cmd环境下执行cd命令移动到需要编译的项目的home目录,然后执行命令:mvn install -Dmaven.test.skip= ...
- CGI与fastcgi与php-fpm与php-cgi的关系
cgi是一个协议,它规定了服务器Nginx会将那些数据传送给PHP-cgi fastcgi也可以说是一个协议.fastcgi是对cgi的性能的一次提高.fastcgi会先启动一个master,解析配置 ...
- Spring 自带的定时任务
需要几天后,或者某个时间后,定时查询数据.需要用到Spring自带的一个注解 @Scheduled(cron="0/5 * * * * ? ")//每隔5秒钟执行 创建一个clas ...
- 改变按钮在iPhone下的默认风格
-webkit-appearance: none; "来改变按钮在iPhone下的默认风格,其实我们可以反过来思路,使用"appearance"属性,来改变任何元素的浏览 ...
- 【Hawk】高级教程——post参数采集万方医学网论文
目标——万方医学网论文列表 http://med.wanfangdata.com.cn/Author/General/A000000001 和普通网页不一样的地方在于点击下一页的时候,URL没有发生变 ...