UVA 103--- Stacking Boxes

2024-06-19 15:32
文章标签 103 uva boxes stacking

本文主要是介绍UVA 103--- Stacking Boxes,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       这道题在小白书中的分类是动态规划,把题AC了之后在网上看解题报告后,多数解法也是DAG上的动态规划。但其实一个简单的深度优先就能解决问题了。首先将每数从大到小排序,再将各组按照排序后的第一个数字的大小进行从大到小排序。需要注意的是,记录各组数据的编号也要和数进行同步的排序。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int k,n;
int anscnt;
int vis[30+5];
vector <vector<int> > box;
vector <int> order;//记录各组数的序号
vector <int> ans;bool cmp(int i,int j){return i>j;}
bool vcmp(vector<int> i,vector<int> j){return i[0]>j[0];}
bool ocmp(int i,int j){return box[i-1][0]>box[j-1][0];}
void dfs(int,int,int);int main()
{//freopen("data.txt","r",stdin);while(cin>>k>>n){vector <int> t;int x;box.clear();order.clear();for(int i=0;i<k;i++){t.clear();order.push_back(i+1);for(int j=0;j<n;j++){cin>>x;t.push_back(x);}sort(t.begin(),t.end(),cmp);//各组数从大到小排序box.push_back(t);}sort(order.begin(),order.end(),ocmp);//先将编号排序sort(box.begin(),box.end(),vcmp);//各组按照首数字的大小从大到小排序ans.clear();memset(vis,0,sizeof(vis));anscnt=0;dfs(0,0,-1);cout<<anscnt<<endl;for(int i=anscnt-1;i>=0;i--){cout<<ans[i];i==0?cout<<endl:cout<<" ";}}return 0;
}void dfs(int deep,int cnt,int prior)
{if(deep==k){if(cnt>anscnt){ans.clear();anscnt=cnt;for(int i=0;i<deep;i++) if(vis[i])ans.push_back(order[i]);}return;}if(prior==-1){//之前还未取任何一组数if(deep<k-1){dfs(deep+1,cnt,prior);vis[deep]=1;dfs(deep+1,cnt+1,deep);vis[deep]=0;}}else{int flag=1;for(int i=0;i<n;i++)if(box[deep][i]>=box[prior][i]) flag=0;if(flag==1){//当前这组数能被之前最后取的一组数装下vis[deep]=1;dfs(deep+1,cnt+1,deep);vis[deep]=0;}dfs(deep+1,cnt,prior);}return ;
}


这篇关于UVA 103--- Stacking Boxes的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075418

相关文章

UVA - 12206 Stammering Aliens (hash)

这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串   H[i] =H[i+1]*131+s[i]  ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。 VIEW CODE #include<

随想录 Day 66 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题

随想录 Day 66 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 101. 孤岛的总面积 101. 孤岛的总面积 时间限制:1.000S 空间限制:256MB 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。 现在你需要计算所有孤

学习法之Stacking

本文转载自:详解stacking过程 之前一直对stacking一知半解,找到的资料也介绍的很模糊。。所以有多看了几篇文章,然后来此写篇博客,加深一下印象,顺便给各位朋友分享一下。 stacking的过程有一张图非常经典,如下: 虽然他很直观,但是没有语言描述确实很难搞懂。 上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证

[Uva 11990] Dynamic Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化 CDQ分治做法 把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0) (t_0, x_0, y_0) 先统计

代码随想录算法训练营第六十六天 |101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

101.孤岛的总面积 文字讲解:101. 孤岛的总面积 | 代码随想录 解题思路 本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。 在遇到地图周边陆地的时候,将1都变为0,此时地图为这样:  这里使用深搜 #include<bits/stdc++.h>us

UVA 11624 搜索

给出1000*1000矩阵,含起点‘J’,路‘.',墙‘#’,火‘F'; 火每秒蔓延一格,人每秒走一步 问人是否可以安全走出矩阵,不能被火碰到 先对所有火BFS一遍,记录每个点被烧到的时间 然后对人BFS一遍,若到每点前没被火烧即可走 #include "stdio.h"#include "string.h"#include "queue"using namespace

UVa 11361 Investigating Div-Sum Property

这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。       还有一点是,当剩余数字d=0时,当且

UVa 1362(LA 3516) Exploring Pyramids

依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),i<k<=j 时,说明在k回到根,那么S(i+1)...S(k-1)构成一棵独立的子树(当然也可能并不是子树)。那么d[i,j]就要加上d[i+1,k-1]*d[k,j],不断递增k,每遇到一个k,d[i,j]+=d[i

UVa 11174 Stand in a Line

依旧是《训练指南》上的一道例题。书上讲的比较抽象,下面就把解法具体一下。因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林。接下来将使用递归的手法。设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树。s[i]为树根为i的子树包含的节点数。如果分别先给各个子树内部排序,那么毫无疑问, 共有f(c1)*f(c2)*f(c3).

UVa 11375 Matches

大年夜的写代码果然状态非常之差...感觉特别困,连个高精度都折腾了我好久。还是刘汝佳《训练指南》里的一道例题,解题思路其实也差不多,但是想对书里面的内容再讲讲。其中d[i]是代表i个火柴棒恰好能构成的正整数数目(不包含整数0),然后有点类似于动态规划的做法,通过已知的d[]求出剩下的d[]。        不过仔细想来貌似有点问题。例如已知d[j],那么d[j+num[0]]+=d[