PACM Team(牛客第三场多校赛+dp+卡内存+打印路径)
题目链接(貌似未报名的不能进去):https://www.nowcoder.com/acm/contest/141/A
题目:
题意:背包题意,并打印路径。
思路:正常背包思路,不过五维的dp很容易爆内存,比赛时无限爆,后面队友提醒用short就过了。不过也可以用滚动减少内存消耗,两种代码实现都贴一下吧~
五维代码实现如下:
- #include <set>
- #include <map>
- #include <queue>
- #include <stack>
- #include <cmath>
- #include <bitset>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- #define lson i<<1
- #define rson i<<1|1
- #define bug printf("*********\n");
- #define FIN freopen("D://code//in.txt", "r", stdin);
- #define debug(x) cout<<"["<<x<<"]" <<endl;
- #define IO ios::sync_with_stdio(false),cin.tie(0);
- const double eps = 1e-;
- const int mod = ;
- const int maxn = 1e7 + ;
- const double pi = acos(-);
- const int inf = 0x3f3f3f3f;
- const ll INF = 0x3f3f3f3f3f3f3f3f;
- short n, P, A, C, M;
- short p[], a[], c[], m[], g[], cnt[];
- short dp[][][][][];
- bool vis[][][][][];
- int main() {
- //FIN;
- cin >>n;
- for(int i = ; i <= n; i++) {
- cin >>p[i] >>a[i] >> c[i] >>m[i] >>g[i];
- }
- cin >>P >>A >>C >>M;
- int flag1 = , flag2 = , flag3 = , flag4 = , mx = ;
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= P; j++) {
- for(int k = ; k <= A; k++) {
- for(int l = ; l <= C; l++) {
- for(int t = ; t <= M; t++) {
- dp[i][j][k][l][t] = dp[i-][j][k][l][t];
- if(j >= p[i] && k >= a[i] && l >= c[i] && t >= m[i]) {
- if(dp[i-][j-p[i]][k-a[i]][l-c[i]][t-m[i]] + g[i] > dp[i-][j][k][l][t]) {
- dp[i][j][k][l][t] = dp[i-][j-p[i]][k-a[i]][l-c[i]][t-m[i]] + g[i];
- vis[i][j][k][l][t] = true;
- }
- }
- }
- }
- }
- }
- }
- for(int j = ; j <= P; j++) {
- for(int k = ; k <= A; k++) {
- for(int l = ; l <= C; l++) {
- for(int t = ; t <= M; t++) {
- if(dp[n][j][k][l][t] > mx) {
- flag1 = j, flag2 = k, flag3 = l, flag4 = t;
- mx = dp[n][j][k][l][t];
- }
- }
- }
- }
- }
- int num = ;
- for(int i = n; i >= ; i--) {
- if(vis[i][flag1][flag2][flag3][flag4]) {
- cnt[num++] = i - ;
- flag1 -= p[i];
- flag2 -= a[i];
- flag3 -= c[i];
- flag4 -= m[i];
- }
- }
- cout <<num <<endl;
- for(int i = num - ; i >= ; i--) {
- cout <<cnt[i] <<" ";
- }
- cout <<"\n";
- return ;
- }
滚动数组实现如下:
- #include <bits/stdc++.h>
- #define fi first
- #define se second
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define lowbit(x) x&-x
- #define MP make_pair
- #define pb push_back
- #define debug(x) cout<<"x= "<<x<<endl;
- #define FIN freopen("in.txt","r",stdin);
- using namespace std;
- typedef long long ll;
- typedef vector<int> vi;
- typedef pair<int,int>pii;
- const int mod=1e9+;
- const ll infll=0x3f3f3f3f3f3f3f3f;
- const int MX = 1e5 + ;
- const int INF = 0x3f3f3f3f;
- short n;
- short dp[][][][];
- bool vis[][][][][];
- short p[],a[],c[],m[],g[];
- short P,A,C,M;
- int main(){
- //FIN;
- cin>>n;
- for(int i=;i<=n;i++)
- cin>>p[i]>>a[i]>>c[i]>>m[i]>>g[i];
- cin>>P>>A>>C>>M;
- memset(dp,,sizeof(dp));
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++){
- for(int j=P;j>=p[i];j--){
- for(int k=A;k>=a[i];k--){
- for(int l=C;l>=c[i];l--){
- for(int o=M;o>=m[i];o--){
- if(dp[j][k][l][o] > dp[j-p[i]][k-a[i]][l-c[i]][o-m[i]]+g[i]) continue;
- dp[j][k][l][o]=dp[j-p[i]][k-a[i]][l-c[i]][o-m[i]]+g[i];
- vis[i][j][k][l][o]=;
- }
- }
- }
- }
- }
- int ans[],num=;
- while(n){
- if(vis[n][P][A][C][M]){
- P-=p[n];
- A-=a[n];
- C-=c[n];
- M-=m[n];
- ans[++num]=n-;
- }n--;
- }
- printf("%d\n",num);
- for(int i=num;i>=;i--)
- printf("%d ",ans[i]);
- printf("\n");
- return ;
- }
PACM Team(牛客第三场多校赛+dp+卡内存+打印路径)的更多相关文章
- 牛客第三场多校 E Sort String
链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 Eddy likes to play with string which is a sequen ...
- 牛客第三场多校 H Diff-prime Pairs
链接:https://www.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy has solved lots of problem involving calcul ...
- uestc summer training #9 牛客第三场 BFS计数
G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 ...
- 牛客第五场多校 J plan 思维
链接:https://www.nowcoder.com/acm/contest/143/J来源:牛客网 There are n students going to travel. And hotel ...
- 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...
- 牛客第五场多校 A gpa 分数规划(模板)
链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 Kanade selected n courses in the university. The ...
- Shuffle Cards(牛客第三场+splay)
题目: 题意:将1~n的数进行m次操作,每次操作将第pi位到pi+si-1位的数字移到第一位,求最后的排列. 思路:现在还没不会写splay,在知道这是splay模板题后找了一波别人的模板,虽然过了, ...
- 牛客第三场 J LRU management
起初看到这道题的时候,草草就放过去了,开了另一道题,结果开题不顺利,总是感觉差一点就可以做出来,以至于一直到最后都没能看这道题qaq 题意:类似于操作系统上讲的LRU算法,有两个操作,0操作代表访问其 ...
- 最长相同01数的子串(map搞搞)--牛客第三场 -- Crazy Binary String
题意: 如题. 或者用我的数组分治也可以,就是有点愚蠢. //#include <bits/stdc++.h> #include <map> #include <iost ...
随机推荐
- 敏捷冲刺Day1
前言: 之前的各种对教务系统的分析,再加上我们两三天的讨论和一个小时的站立会议,我们做出最终的决定.--我们决定换个项目主题,将原来的教务辅助系统换成现在的校园帮帮帮服务,并在之后会将完成后的计划书附 ...
- 【Docker 命令】- ps命令
docker ps : 列出容器 语法 docker ps [OPTIONS] OPTIONS说明: -a:显示所有的容器,包括未运行的. -f:根据条件过滤显示的内容. --format :指定返回 ...
- iis7 appcmd命令
iis中提供了appcmd命令 可以通过命令行来配置iis appcmd.exe 默认路径在 c:\windows\system32\inetsrv\下 若要回收应用程序池,请使用以下语法: appc ...
- [剑指Offer] 50.数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- K-means聚类算法与EM算法
K-means聚类算法 K-means聚类算法也是聚类算法中最简单的一种了,但是里面包含的思想却不一般. 聚类属于无监督学习.在聚类问题中,给我们的训练样本是,每个,没有了y. K-means算法是将 ...
- 【bzoj1131】[POI2008]Sta 树形dp
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- HTML5可用的css reset
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, ci ...
- ARC077C pushpush 递推
---题面--- 题解: 貌似一般c题都是递推... 观察到最后一个插入的数一定在第一个,倒数第二个插入的数一定在倒数第一个,倒数第三个插入的数一定在第2个,倒数第四个插入的数一定在倒数第2个…… O ...
- Java.util包简单总结
Java.util包简单总结 1. util包的框架 常用的集合类主要实现两个“super接口”而来:Collection和Map. 1.1 Collection有两个子接口:List和Set è¿é ...
- POJ1204:Word Puzzles——题解
http://poj.org/problem?id=1204 题目大意:给一个字母表,求一些字符串的开端第一次出现的位置和字符串的方向(字符串可以按照八个方向放在字母表中可匹配的位置) ——————— ...