华为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 ...
随机推荐
- 网页端打开手机上的app
iOS/Android 浏览器(h5)及微信中唤起本地APP 在移动互联网,链接是比较重要的传播媒质,但很多时候我们又希望用户能够回到APP中,这就要求APP可以通过浏览器或在微信中被方便地唤起. 这 ...
- jQuery checkbox的全选与反选
1:checkbox的全选与反选 js 代码 $("#cbAll").click(function(){ if($("#cbAll").is(":ch ...
- js,jq,css选择器
js获取节点: var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; / ...
- while 与do ..while区别
package com.chongrui.test;/*while语句的一般形式如下:while(表达式)语句表达式为非0值,执行while中内嵌语句.它是先判断表达式,在根据表达式值,执行语句.do ...
- Tensorflow 变量的共享
https://github.com/chenghuige/tensorflow-exp/blob/master/examples/sparse-tensor-classification/ tens ...
- Python +crontab定时备份目录发送邮件
公司有一台静态页面展示服务器仅供给客户展示我们做的项目,当时买的时候是最低配,也就是磁盘空间为20G的系统盘,考虑到代码量很小所以没有另加磁盘,后来项目多了,就写了个crontab 定时备份目录. 就 ...
- Python爬虫进阶二之PySpider框架安装配置
关于 首先,在此附上项目的地址,以及官方文档 PySpider 官方文档 安装 1. pip 首先确保你已经安装了pip,若没有安装,请参照 pip安装 2. phantomjs PhantomJS ...
- Selenium通过WebDriver控制IE浏览器出错 Browser zoom level was set to 109%. It should be set to 100%
错误信息: WebDriverException: Message: Unexpected error launching Internet Explorer. Browser zoom level ...
- ppmoney 总结一
1.JQ $.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- ROS学习(三)—— ROS文件系统
一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...