UVa 506 System Dependencies (细节问题)
题意:输入几种指令,让你进行模拟操作,指令如下:
DEPEND item1 item2 (item3 ...) | 安装item1需要先安装item2(、item3……) |
INSTALL item1 | 安装item1,如果item1依赖其他组件,则先安装其依赖的其他组件(如果已经安装就不用安装了) |
REMOVE item1 | 移除item1及其依赖的全部组件,如果组件被其他程序依赖,则不移除 |
LIST | 输出当前已安装的所有组件 |
END | 结束程序 |
析:看到这个题,虽然是放在数据结构这一章里,没觉得有什么数据结构的东西,算法上并不难,只是操作麻烦一点,又是调了好长时间,开始用的1024vector,
RE了,后来我加大了10倍,还有的是后来我看到网上样例不一样都过了,很明显是我没读懂题意,可能移除时顺序是无所谓的。
首先需要的是把每个名字转化成一个id数,我用了两个map,其实可以不用的,那么时间复杂度可能高一点,然后要两个vector,一个存所依赖的组件,一个存依赖于的组件列表。
然后还要用一个数组来记录未安装,还是隐式安装,还是显示安装。安装删除时用递归实现较好。
主要注意以下几点:
输出比较麻烦,如果已经安装过的显式安装,要输出已经安装了,隐式的直接忽略。
如果要删除显式安装,除了本身,那么要输出仍然需要。
如果要删除一个不存在的显式安装,要输出没有安装。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <sstream>
#include <map>
#include <algorithm> using namespace std;
const int maxn = 10240;
vector<int> v1[maxn];
vector<int> v2[maxn];
vector<int> is_install;
map<string, int> mp;
map<int, string> item;
int cnt = 0;
int status[maxn];//0表示未安装,1表示隐式安装,2表示显式安装 int getid(const string &s){//获得id
if(mp.count(s)) return mp[s];
mp[s] = ++cnt;
item[cnt] = s;
return cnt;
} void install(int t, bool ok){
if(status[t] && ok){ cout << " " << item[t] << " is already installed.\n"; return ; }//已经安装过的显式安装,要输出已经安装了
if(status[t]) return ;//隐式安装,忽略 for(int i = 0; i < v1[t].size(); ++i)
install(v1[t][i], false);//递归查找安装
cout << " Installing " << item[t] << endl;
status[t] = ok ? 1 : 2;//确定是隐式安装还是显式安装
is_install.push_back(t);
} bool need(int t){
for(int i = 0; i < v2[t].size(); ++i)
if(status[v2[t][i]]) return true;//这个地方我刚开始写的是 2 == status[v2[t][i]],
//结果不对,因为首先在存储时就已经确定了,存入的都是显式安装的,并不用重新判定,
//只要判定是不是移除了就好,另外的是在安装时实验它的状态可能会改变,所以不能这么写
return false;
} void remove1(int t, bool ok){
if(ok && !status[t]){ cout << " " << item[t] << " is not installed.\n"; return ; }//删除一个不存在的显式安装,要输出没有安装。 if((ok || status[t] == 2) && !need(t)){
status[t] = 0;
is_install.erase(remove(is_install.begin(), is_install.end(), t), is_install.end());//remove不是真删除元素,而是把它们放到后面去,并返回地扯
cout << " Removing " << item[t] << endl;
for(int i = v1[t].size()-1; i >= 0; --i)//这个地方如果从0开始也对,应该是我没读懂题意吧
remove1(v1[t][i], false);
return ;
}
if(ok) cout << " " << item[t] << " is still needed.\n";//删除显式安装,除了本身,那么要输出仍然需要。
} int main(){
// freopen("in.txt", "r", stdin);
string s;
memset(status, 0, sizeof(status));
while(getline(cin, s)){
cout << s << endl;
if(s == "END") break;
stringstream ss(s);
string s1, s2;
ss >> s1;
if('D' == s1[0]){
ss >> s2;
int t = getid(s2);
while(ss >> s){ v1[t].push_back(getid(s)); v2[getid(s)].push_back(t); }
}
else if('I' == s1[0]){
while(ss >> s2) install(getid(s2), true);
}
else if('R' == s1[0]){
ss >> s2; remove1(getid(s2), true);
}
else if('L' == s1[0]){
for(int i = 0; i < is_install.size(); ++i)
cout << " " << item[is_install[i]] << endl;
}
}
return 0;
}
UVa 506 System Dependencies (细节问题)的更多相关文章
- 【STL+模拟】UVa 506 - System Dependencies
System Dependencies Components of computer systems often have dependencies--other components that m ...
- Uva - 506 - System Dependencies
模拟题,注意显示安装和隐式安装,显示安装的必须显示显示删除.把名字转化为整数维护.其他注意都注释了.输入稍微多一下,题目不是很麻烦. AC代码: #include <iostream> # ...
- UVA 506 System Dependencies(模拟 烂题)
https://vjudge.net/problem/UVA-506 题目是给出了五种指令,DEPEND.INSTALL.REMOVE.LIST.END,操作的格式及功能如下: DEPEND item ...
- Learning ROS: Managing System dependencies
Download and install the system dependencies for turtlesim: roscd turtlesim cat package.xml rosdep i ...
- 【例题 6-21 UVA - 506】System Dependencies
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个物品它的依赖有哪些,以及它被哪些东西依赖就可以了. 显式安装的东西不能被隐式删除删掉(就是remove item,然后删除i ...
- 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good
最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...
- Perl和操作系统交互(一):system、exec和反引号
调用操作系统命令:system函数 system函数可以直接让perl调用操作系统中的命令并执行. system入门示例 例如: #!/usr/bin/perl system 'date +" ...
- 你应当如何学习C++(以及编程)(转载)
你应当如何学习C++(以及编程)(rev#1) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Javascript是世界上最受误解的语言,其实 ...
- 《Odoo开发指南》精选分享—第1章-开始使用Odoo开发(1)
引言 在进入Odoo开发之前,我们需要建立我们的开发环境,并学习它的基本管理任务. 在本章中,我们将学习如何设置工作环境,在这里我们将构建我们的Odoo应用程序.我们将学习如何设置Debian或Ubu ...
随机推荐
- mysql中distinct
1.Distinct 位置 单独的distinct只能放在开头,否则报错,语法错误,与其他函数使用时候,没有位置限制如下 Select player_id,count(distinct(task_id ...
- [C++ Primer] 第7章: 类
定义抽象数据类型 定义在类内部的函数是隐式的inline函数. const成员函数 又叫做常量成员函数, 成员函数参数列表之后紧跟const关键字, const修饰的是类this指针. 默认情况下th ...
- 【android】SDK环境变量配置
Android SDK: Android SDK提供了你的API库和开发工具构建,测试和调试应用程序,Android.简单来讲,Android SDK 可以看做用于开发和运行Android应用的一个软 ...
- 【monkeyrunner】monkeyrunner 常见问题
1.monkeyrunner和部分机型的指针位置会出现冲突 问题描述:当我们用monkeyrunner定位坐标时,会打开设置的指针位置服务.当指针位置开启时,运行monkeyrunner时,真机会出现 ...
- hBuilder培训资源视频教程汇总
DCloud对开发者的学习支持分3个层面:官方文档.三方专业培训.网友经验分享 DCloud的精力主要在做产品,配套的文档也会一直完善好.但专业的培训还不是DCloud能做好的,在HTML5中国产业联 ...
- memcached内存管理机制分析
memached是高性能分布式内存对象系统,通过在内存中存储数据对象来减少对磁盘的数据读取次数,提高服务速度. 从业务需求出发.我们通过一条命令(如set)将一条键值对(key,value)插入mem ...
- Java 8 Lambda表达式之方法引用 ::双冒号操作符
双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...
- 控件m
窗体的事件:删除事件:先将事件页面里面的挂好的事件删除,再删后台代码里面的事件 Panel是一个容器 1.Label -- 文本显示工具Text:显示的文字取值.赋值:lable1.Text 2.Te ...
- VMware vSphere Client下增加虚拟机磁盘空间的方法
随着系统运维时间的增长,磁盘就日益的损耗,如果遇到虚拟机报磁盘空间不足怎么办?还好,我们可以通过磁盘阵列增加磁盘空间,然后扩容到虚拟机中去. 对于linux虚拟机磁盘扩容的方案有两种,一种就是原有的实 ...
- Asp.net 页面传值的方法
ASP.NET页面传值的方法 From:Refresh-air 在面试的时候,经常会遇到这样的问题,其实我们会对其中的几种方法比较熟悉,因为项目中经常使用.但是要全面的回答ASP.NET中页面传值的方 ...