UVA 506 System Dependencies(模拟 烂题)
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(模拟 烂题)的更多相关文章
- 【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 (细节问题)
题意:输入几种指令,让你进行模拟操作,指令如下: DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(.item3……) INSTALL item1 安装 ...
- uva 10562 undraw the trees(烂题) ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABB4AAAM9CAYAAAA7ObAlAAAgAElEQVR4nOyd25GsupKGywVswAV8wA ...
- uva 10305 ordering tasks(超级烂题)——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHIAAAHDCAYAAABI5T2bAAAgAElEQVR4nOydPY7svLW1awQGNABHCm
- UVA.10881 Piotr's Ants (思维题)
UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- UVA.11300 Spreading the Wealth (思维题 中位数模型)
UVA.11300 Spreading the Wealth (思维题) 题意分析 现给出n个人,每个人手中有a[i]个数的金币,每个人能给其左右相邻的人金币,现在要求你安排传递金币的方案,使得每个人 ...
- UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用) 题意分析 绝对的好题. 先说做完此题的收获: 1.对数据结构又有了宏观的上的认识; 2.熟悉了常用STL ...
随机推荐
- 关于Tomcat服务器的笔记
javaWEB的概念: a)什么是 JavaWeb: JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb. JavaWeb 是 ...
- Java代码操作zookeeper
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- git只提交部分修改的文件(提交指定文件)
在我们的项目中,经常会在本地编译一些代码,还未写完,测试那边来告诉你要改改某个文件的bug,非常着急,此时改完了,提交的时候,自己还在编译的代码并不想提交,此时,你可以利用git这些指令帮助你! 1/ ...
- Git(9)-- 远程仓库的使用
@ 目录 1.查看远程仓库:git remote 2.添加远程仓库:git remote add 3.从远程仓库中抓取与拉取:git fetch和 git pull 4.推送到远程仓库:git pus ...
- sqli-labs lesson 32-37
宽字节注入: 原理:mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围).我们在过滤 ' 的时候(也就是从防御的角度 ...
- Sqli-Labs less20-22
less-20 第20关成功登陆之后会产生一个cookie,作为下次登陆的凭证(可以用于登陆其他人的qq空间) 这里我依然使用burp suite,其实火狐和谷歌上有许多插件可以改http头和cook ...
- RabbitMQ和Elasticsearch的使用笔记
Demo介绍 学习rabbitmq和elasticsearch后的小练习,主要功能点介绍: 1.elasticsearch实现搜索.条件查询和分页: 2.搜索周边酒店信息 3.酒店竞价排名: 4.后台 ...
- 深入解析多态和方法调用在JVM中的实现
深入解析多态和方法调用在JVM中的实现 1. 什么是多态 多态(polymorphism)是面向对象编程的三大特性之一,它建立在继承的基础之上.在<Java核心技术卷>中这样定义: 一个对 ...
- docker部署minio
快速部署 docker run -p 9000:9000 --name myminio \ -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \ ...
- 消除不受信任的HTML (来防止XSS攻击)
问题 在做网站的时候,经常会提供用户评论的功能.有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cr ...