https://vjudge.net/problem/UVA-506

  题目是给出了五种指令,DEPEND、INSTALL、REMOVE、LIST、END,操作的格式及功能如下:

DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(、item3……)
INSTALL item1 安装item1,如果item1依赖其他组件,则先安装其依赖的其他组件
REMOVE item1 移除item1及其依赖的全部组件,如果组件被其他程序依赖,则不移除
LIST 输出当前已安装的所有组件
END 结束程序

  INSTALL指令中作为参数的组件的安装是显式安装,其所依赖的组件的安装不是显示安装。被显式安装的组件只能通过REMOVE指令显式删除,而移除中的组件如果当前被其他显式安装的组件直接或间接地依赖,则不能通过REMOVE移除。

  每当输入指令之后,先原样输出一遍指令,然后执行指令。安装组件时如果可以安装组件则需输出“Installing
组建名”。如果显式安装时组件已被安装则提示“组建名 is already
installed.”,隐式安装则无需提示。如果显式删除组件时组件未被安装则提示“组建名 is not
installed.”,如果组件被其他组件依赖则提示“组建名 is still needed.”,隐式卸载则无需提示。

  其实就是个用STL做的复杂模拟,纯属吃力不讨好的题目,并学不到什么算法思想,唯一的亮点就是为一个组件建立依赖和被依赖两个列表,其他的操作模拟即可。

 1 #include <iostream>
2 #include <algorithm>
3 #include <string>
4 #include <sstream>
5 #include <set>
6 #include <vector>
7 #include <stack>
8 #include <map>
9 #include <queue>
10 #include <deque>
11 #include <cstdlib>
12 #include <cstdio>
13 #include <cstring>
14 #include <cmath>
15 #include <ctime>
16 #include <functional>
17 using namespace std;
18
19 int cnt = 0, status[maxn];
20 vector<int> depend[maxn], depend2[maxn];
21 vector<int> installed;
22 string name[maxn];
23
24 int get_id(const string & x)
25 {
26 for (int i = 0; i < cnt; i++)
27 if (name[i] == x)
28 return i;
29 name[cnt++] = x;
30 return cnt-1;
31 }
32
33 void instal(int item, bool top)
34 {
35 if (!status[item]){
36 for (size_t i = 0; i < depend[item].size(); i++)
37 instal(depend[item][i], false);
38 cout << " Installing " << name[item] << endl;
39 status[item] = top ? 1 : 2;
40 installed.push_back(item);
41 }
42 else if(top)
43 cout << " " << name[item] << " is already installed." << endl;
44 }
45
46 bool needed(int item)
47 {
48 for (size_t i = 0; i < depend2[item].size(); i++)
49 if (status[depend2[item][i]])
50 return true;
51 return false;
52 }
53
54 void Remove(int item, bool top)
55 {
56 if(top && status[item]==0)
57 cout << " " << name[item] << " is not installed." << endl;
58 else if(top && needed(item))
59 cout << " " << name[item] << " is still needed." << endl;
60 else if ((top || status[item] == 2) && !needed(item)){
61 status[item] = 0;
62 installed.erase(remove(installed.begin(), installed.end(), item), installed.end());
63 cout << " Removing " << name[item] << endl;
64 for (size_t i = 0; i < depend[item].size(); i++)
65 Remove(depend[item][i], false);
66 }
67 }
68
69 int main()
70 {
72 ios::sync_with_stdio(false);
73 string line;
74 while (getline(cin, line), line != "END")
75 {
76 cout << line << endl;
77 stringstream ss(line);
78 if (line[0] == 'L'){
79 for (size_t i = 0; i != installed.size(); ++i)
80 cout << " " << name[installed[i]] << endl;
81 }
82 else{
83 string t1, t2, t3;
84 ss >> t1 >> t2;
85 if (t1[0] == 'D'){
86 while (ss >> t3){
87 depend[get_id(t2)].push_back(get_id(t3));
88 depend2[get_id(t3)].push_back(get_id(t2));
89 }
90 }
91 else if (t1[0] == 'I')
92 instal(get_id(t2), true);
93 else if (t1[0] == 'R')
94 Remove(get_id(t2), true);
95 }
96 }
97 cout << "END" << endl;
98 return 0;
99 }

UVA 506 System Dependencies(模拟 烂题)的更多相关文章

  1. 【STL+模拟】UVa 506 - System Dependencies

    System Dependencies  Components of computer systems often have dependencies--other components that m ...

  2. Uva - 506 - System Dependencies

    模拟题,注意显示安装和隐式安装,显示安装的必须显示显示删除.把名字转化为整数维护.其他注意都注释了.输入稍微多一下,题目不是很麻烦. AC代码: #include <iostream> # ...

  3. UVa 506 System Dependencies (细节问题)

    题意:输入几种指令,让你进行模拟操作,指令如下: DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(.item3……) INSTALL item1 安装 ...

  4. uva 10562 undraw the trees(烂题) ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABB4AAAM9CAYAAAA7ObAlAAAgAElEQVR4nOyd25GsupKGywVswAV8wA ...

  5. uva 10305 ordering tasks(超级烂题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHIAAAHDCAYAAABI5T2bAAAgAElEQVR4nOydPY7svLW1awQGNABHCm

  6. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  7. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. UVA.11300 Spreading the Wealth (思维题 中位数模型)

    UVA.11300 Spreading the Wealth (思维题) 题意分析 现给出n个人,每个人手中有a[i]个数的金币,每个人能给其左右相邻的人金币,现在要求你安排传递金币的方案,使得每个人 ...

  9. UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)

    UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用) 题意分析 绝对的好题. 先说做完此题的收获: 1.对数据结构又有了宏观的上的认识; 2.熟悉了常用STL ...

随机推荐

  1. 安装MySQL详细说明

    安装MySQL详细说明 下载后得到zip压缩包 解压到自己的安装目录 添加环境变量 我的电脑->属性->高级->环境变量 选择PATH,在其后面添加:你的mysql安装文件下面的bi ...

  2. Seaborn基础画图实例

    使用seaborn画图时,经常不知道该该用什么函数.忘记函数的参数还有就是画出来的图单调不好看. 所以,本人对seaborn的一些常用的画图函数,并结合实例写成了代码,方便以后查询和记忆. 若代码或注 ...

  3. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  4. CobaltStrike4.0——渗透神器

    CobaltStrike4.0--渗透神器 Cobaltstrike简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人称为CS,其拥有多种协议主机上线方式,集成了 ...

  5. JavaScript new 关键词解析及原生实现 new

    java里面,new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,原型语言没类,只有对象与原型链继承 JavaScript 中 new 表达式的作用是生成 ...

  6. Golang语言系列-09-接口

    接口 接口的定义和实现 package main import "fmt" /* [接口] 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现 ...

  7. 【原创】Java内存攻击技术漫谈

    前言 Java技术栈漏洞目前业已是web安全领域的主流战场,随着IPS.RASP等防御系统的更新迭代,Java攻防交战阵地已经从磁盘升级到了内存里面. 在今年7月份上海银针安全沙龙上,我分享了< ...

  8. sql server时间转换

    --getdate 获取当前时间 select getdate() --dateadd 原有时间加: 2013-02-17 13:20:16 此时间加12个月 select dateadd(MONTH ...

  9. 高效编程:在IntelliJ IDEA中使用VIM

    硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 概述 Vim是一个功能强大.高度可定制的文本编辑器; 具体有多强大,我现 ...

  10. NOIP 模拟 10 考试总结

    T1 一道很妙的题,打暴力分也很多,但是考试的时候忘开 long long 了. 题解 T2 一道挺水的题,不过...(打挂了) 题解 T3 此题甚妙,转化真多,不过对思维是一个非常大的扩展 题解 考 ...