T293037 [传智杯 #5 练习赛] 白色旅人
题目描述
有一个物品队列 \frak BB,初始时为空。现在共有三种操作。每个操作会给定三个整数 \mathrm{op},x,yop,x,y,其中 \mathrm{op}op 表示操作种类,x,yx,y 是操作的参数。操作分为如下三种:
- 11:向 \frak BB 尾部添加一个物品,它的体积为 xx,价值为 yy。
- 22:把 \frak BB 尾部最后物品移除。保证此时最少有一个物品。
- 33:有一个体积为 xx 的背包。用 \frak BB 内的物品填充它,每个物品最多用一次,询问最多能获得多大的价值。提示:当 \frak BB 为空时,相当于没有物品可用,答案就是 00。
对于操作 22 和 33,请忽略多余的参数。
本题强制在线。强制在线的方式请见输入格式。
输入格式
- 第一行有两个正整数 n,m_{\max}n,mmax,表示操作个数以及操作 33 提到的背包的体积的最大值。
- 接下来 nn 行,每行给定三个整数 \mathrm{op},x',y'op,x′,y′。将 x',y'x′,y′ 分别异或上 \mathrm{lastans}lastans 得到该次询问真正的 x,yx,y。其中,\mathrm{lastans}lastans 是上一次操作 33 询问的结果。在第一次操作 33 前,\mathrm{lastans}=0lastans=0。
输出格式
- 输出有若干行,表示每次 33 操作的结果。
输入输出样例
输入 #1复制
10 10 1 3 4 1 5 5 3 4 1 3 12 5 1 14 3 3 1 8 2 11 11 3 2 11 2 8 8 3 12 8
输出 #1复制
4 9 10 9 4
说明/提示
样例解释
解码后的输入数据为:
10 10
1 3 4
1 5 5
3 4 1
3 8 1
1 7 10
3 8 1
2 1 1
3 8 1
2 1 1
3 5 1
对于十次操作,物品序列的情况如下;
- 加入体积为 33,价值为 44 的物品。物品序列为 \{(3,4)\}{(3,4)}。
- 加入体积为 55,价值为 55 的物品。物品序列为 \{(3,4),(5,5)\}{(3,4),(5,5)}。
- 查询体积为 44 的背包能装下的物品价值最大值。此时只能装第一个物品,于是答案为 44。
- 查询体积为 88 的背包能装下的物品价值最大值。此时可把两个物品都装下,答案为 99。
- 加入体积为 77,价值为 1010 的物品。物品序列为 \{(3,4),(5,5),(7,10)\}{(3,4),(5,5),(7,10)}。
- 查询体积为 88 的背包能装下的物品价值最大值。此时直接装第三个物品获得的价值大于装下另外两个,于是答案为 1010。
- 删除最后一个物品。此时物品序列为 \{(3,4),(5,5)\}{(3,4),(5,5)}。
- 查询体积为 88 的背包能装下的物品价值最大值。此时可把两个物品都装下,答案为 99。
- 删除最后一个物品。此时物品序列为 \{(3,4)\}{(3,4)}。
- 查询体积为 55 的背包能装下的物品价值最大值。此时只有一个物品可装,答案为 44。
数据范围及约定
对于全部数据,1\le n\le 3\times 10^41≤n≤3×104,1\le m_{\max}\le 2\times 10^41≤mmax≤2×104,1\le x, y\le 2\times 10^41≤x,y≤2×104。
首先来个内存不通过的代码:使用暴力dfs
import java.util.*;import java.util.Scanner;public class Main {public static Integer n;public static Integer max;public static Integer x[];public static Integer y[];public static Integer op[];public static Integer zt[];public static Integer num = 0;public static Integer lastans = 0;public static List<Integer> listx = new ArrayList<>();public static List<Integer> listy = new ArrayList<>();public static void main(String[] args) {Scanner sca = new Scanner(System.in);n = sca.nextInt();max = sca.nextInt();x = new Integer[n];y = new Integer[n];op = new Integer[n];zt = new Integer[n];for(int i = 0;i<n;i++) {op[i] = sca.nextInt();x[i] = sca.nextInt();y[i] = sca.nextInt();zt[i] = 0;}// 解码数据for(int i = 0;i<n;i++) {x[i] = x[i]^lastans;y[i] = y[i]^lastans;
// System.out.println(x[i]+" "+y[i]+"");if(op[i]==1) {listx.add(x[i]);listy.add(y[i]);}else if (op[i]==2) {if(listx.size()>1) {listx.remove(listx.size()-1);listy.remove(listy.size()-1);}}else if (op[i]==3) {
// 搜寻最大的价值dfs(x[i],0);System.out.println(num);lastans = num;num = 0;
// System.out.println(maxs);}// System.out.println(x[i]+","+y[i]+" :"+listx+" "+listy);}}
// 剩余当前背包mx 4 当前背包内价值my 第几个物品的索引index public static int dfs(Integer mx,Integer my) {if(listx.size()==0) {return 0;}for(int i = 0;i<listx.size();i++) {if(zt[i]==0) {//如果这个没在包内
// System.out.println("zt.get(i):"+zt[i]);if(mx>=listx.get(i)) {//这个包是否能装下该物品mx = mx-listx.get(i);//剩余容量my = my+listy.get(i);//当前价值if(my>num) {//存储最大的有效价值num = my;}zt[i]=1;
// 进行下一个搜索dfs(mx, my);mx = mx+listx.get(i);//剩余容量my = my-listy.get(i);//当前价值zt[i]=0;}else {zt[i] = 1;
// 进行下一个搜索dfs(mx, my);zt[i] = 0;}}}return 0;}}
对代码进行优化 ,不会了...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;import java.util.*;public class Main {public static List<Integer> listx = new ArrayList<>(),listy = new ArrayList<>();//存放大小 价值public static int dp[][],dp1[],dp2[],m;public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int lastans = 0;String s = reader.readLine();int n = Integer.parseInt(s.split(" ")[0]);//一共几行int max = Integer.parseInt(s.split(" ")[1]);//背包体积最大值int ma = 0;dp1 = new int[max+1];dp2 = new int[max+1];for(int i=0;i<n;i++) {String s1 = reader.readLine();int op = Integer.parseInt(s1.split(" ")[0]);//编号类型int x = Integer.parseInt(s1.split(" ")[1]);//空间int y = Integer.parseInt(s1.split(" ")[2]);//价值x = x^lastans;y = y^lastans;if(op==3) {lastans = dp1[x];System.out.println(dp1[x]);}else if(op==1){for(int j = max;j>=x;j--) {dp1[j] = Math.max(dp1[j], dp1[j-x]+y);}}else if(op==2){for(int j = max;j>=x;j--) {dp1[j] = Math.min(dp1[j], dp1[j-x]-y);}}}}}
T293037 [传智杯 #5 练习赛] 白色旅人相关推荐
- 第五届“传智杯”全国大学生计算机大赛(练习赛)传智杯 #5 练习赛] 平等的交易
[传智杯 #5 练习赛] 平等的交易 题目描述 你有 n n n 件道具可以买,其中第 i i i 件的价格为 a i a_i ai. 你有 w w w 元钱.你仅能用钱购买其中的一件商道具.当然, ...
- 第三届“传智杯(练习赛)--E.儒略历
题目链接:儒略历 模拟就行了,注意看好闰年的规则,已掉坑 #include<bits/stdc++.h> using namespace std; int s1[13]={0,31, 28 ...
- 第五届“传智杯”全国大学生计算机大赛(练习赛)传智杯 #5 练习赛] 前四题Python解答
第一道题: 给定若干个字符串,不定数量,每行一个.有些字符串可能出现了多次. 如果读入一个字符串后,发现这个字符串以前被读入过,则这个字符串被称为前面相同的字符串的复读,这个字符串被称为复读字符串. ...
- T292113 [传智杯 #5 练习赛] 平等的交易
吐槽一下: 是我理解能力太差劲了吗?这题当时做的时候真没读懂,整的跟阅读理解似的2333,个人感觉这题出的不好.. 言归正传: 这题思路很简单,就是想让你先拿你的钱,必须买一件,之后用这一件尽可能多的 ...
- T156527 直角三角形-传智杯(练习赛)
题目描述 一个直角三角形的两个直角边是 a,b(a\le b)a,b(a≤b),其斜边是 cc,且 a,b,ca,b,c 都是正整数.现在我们已经知道了斜边长度 cc,请问这个直角三角形的两个直角边的 ...
- 第五届“传智杯”全国大学生计算机大赛(练习赛)
前言:这次练习赛对应的洛谷原题分别是B3654.P8547.P8444.P8462.P8827.P5391.有需要的可以去洛谷找原题看题解弄懂自己不会的 官方给的:练习赛满分程序(多语言):云剪贴板 ...
- 答案解析(C语言版本)——第五届“传智杯”全国大学生计算机大赛(练习赛)
目录 A [传智杯 #5 练习赛] 复读 输入输出样例 输入 #1 输出 #1 代码解析如下 B [传智杯 #5 练习赛] 时钟 输入输出样例 输入 #1 输出 #1 输入 #2 输出 #2 输入 # ...
- 洛谷随机刷题之传智杯#3
[传智杯 #3 练习赛] 直角三角形 题目描述 一个直角三角形的两个直角边是 a , b ( a ≤ b ) a,b(a\le b) a,b(a≤b),其斜边是 c c c,且 a , b , c a ...
- 第五届“传智杯”全国大学生计算机大赛(练习赛)前四题题解
第五届"传智杯"全国大学生计算机大赛(练习赛) 练习赛题单链接:传智杯练习赛 仅有会做的前四题题解,还是太弱了( ^ M ^ !!) 第一题 链接:复读 思路: 就是哈希表记录下出 ...
最新文章
- android 找不到类文件,Android Studio单元测试找不到类文件!
- 那些容易忽略的事(1) -变量与运算符+
- LVM和raid结合使用
- BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
- C语言 memset()函数(内存初始化函数)
- std中稳定排序算法_敏哥:深挖亚马逊A9算法中的广告搜索排序
- Wannafly挑战赛17
- LeetCode 1017. 负二进制转换(负数进制转换)
- 基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现
- 数据中心业务中断 多与运营流程有关
- python根据题库答案自动答题_直播答题助手 自动检测出题、搜索答案
- 计算机搜不到连接打印机主机,计算机找不到打印机设备?如果我无法连接怎么办?让我们看一下处理方法...
- 数据库笔试面试(第一版)——根据题目完成以下50道SQL语句
- lmp91000偏压配置求助
- 什么是网页源代码和网站的源代码
- java过滤关键字,敏感词汇
- Kubernetes(k8s)基础之二:容器编排介绍及概念
- 原生js、css分别实现提示框渐渐消失的效果
- 光剑读书思想录 2014.5.7
- 模拟通讯录系统2.0
热门文章
- round,floor与ceil函数,abs,real与imag函数
- 示波器1m和50欧姆示阻抗匹配_示波器的阻抗选择
- SQLI DUMB SERIES-8
- 移动端网页的基础制作
- Python自动化小米手环运动数据导出
- 微信小程序万里目_微信小程序“注册”你不知道的秘密
- 记录:如何解决Ubuntu20.04无法联网问题【亲测有效】
- Python:佛祖保佑
- 深入理解安卓异步任务AsyncTask
- Caused by: java.io.IOException: The temporary upload location [......] is not valid